Утечка, потому что 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()
.
Та да - Утечка памяти.