Утечка памяти для 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 выделяет память внутренне. Очевидно, есть случаи, когда он не выпускает его.