Утечка памяти для CComBSTR - PullRequest
       47

Утечка памяти для CComBSTR

7 голосов
/ 17 ноября 2009

Я прочитал, что следующий код вызывает утечку памяти. Но не понял почему.

CComBSTR str;
pFoo->get_Bar(&str);
pFoo->get_Baf(&str);

Как это вызывает утечку, когда мы ничего не выделяем?

Ответы [ 2 ]

11 голосов
/ 17 ноября 2009

Утечка, потому что 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() на & str, проблема в том, что CComBSTR не знает, что вы меняете строку. Итак, вы звоните get_Baf() так:

HRESULT get_Baf(BSTR* arg) { *arg = SysAllocString(L"My String"); }

Теперь get_Baf() перезаписал исходное значение внутреннего BSTR str, при этом никто не освобождает данные, выделенные get_Bar().

Та да - Утечка памяти.

4 голосов
/ 17 ноября 2009

Возможно, на этой странице Microsoft вы читали об этом:

http://msdn.microsoft.com/en-us/library/bdyd6xz6.aspx

Проблемы утечки памяти

Передача адреса инициализированной CComBSTR в функцию в качестве параметра [out] вызывает утечку памяти.

Объект CComBSTR выделяет память внутренне. Очевидно, есть случаи, когда он не выпускает его.

...