Утечка памяти для CComBSTR
Я читал, что следующий код вызывает утечку памяти. Но не понимал почему.
CComBSTR str;
pFoo->get_Bar(&str);
pFoo->get_Baf(&str);
Как это вызывает утечку, когда мы ничего не выделяем?
2 ответов
он протекает, потому что get_Bar()
и get_Baf()
не знаю, что вы используете CComBSTR.
когда вы берете адрес CComBSTR, то, что вы фактически передаете базовому объекту, является указателем на член BSTR CComBSTR.
разбивка последовательности:
CComBSTR str;
это инициализирует внутренний BSTR в NULL.
pFoo->get_Bar(&str);
get_Bar()
видит BSTR* и заполняет его фактическими данными. Вот так:
HRESULT get_Bar(BSTR* arg) { *arg = SysAllocString(L"My String"); }
теперь внутренний тип BSTR из str
является настоящим BSTR. Когда CComBSTR выходит за рамки, он удалит str
член.
теперь, если вы называете get_Baf()
on &str проблема в том, что CComBSTR не знает, что вы меняете строку. Так ты называешь get_Baf()
такой:
HRESULT get_Baf(BSTR* arg) { *arg = SysAllocString(L"My String"); }
теперь get_Baf()
перезаписал исходное значение str
внутренний BSTR без кого-либо освобождая данные, которые были выделены get_Bar()
.
Ta da-утечка памяти.
эта страница Microsoft, вероятно, где вы читаете об этом:
http://msdn.microsoft.com/en-us/library/bdyd6xz6.aspx
Проблемы С Утечкой Памяти
передача адреса инициализированного CComBSTR функции в качестве параметра [out] вызывает утечку памяти.
объект CComBSTR выделяет память внутренне. Очевидно, есть случаи, когда он не выпускает его.