gpt4 book ai didi

com - CComBSTR 的内存泄漏

转载 作者:行者123 更新时间:2023-12-04 10:13:09 30 4
gpt4 key购买 nike

我已阅读以下代码会导致内存泄漏。但不明白为什么。

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

当我们不分配任何东西时,它是如何导致泄漏的?

最佳答案

它泄漏是因为 get_Bar()get_Baf()不知道您使用的是 CComBSTR。

当您获取 CComBSTR 的地址时,您实际上传递给底层对象的是指向 CComBSTR 的 BSTR 成员的指针。

分解顺序:

CComBSTR str;

这将内部 BSTR 初始化为 NULL。
pFoo->get_Bar(&str);
get_Bar()看到一个 BSTR* 并用实际数据填充它。像这样:
HRESULT get_Bar(BSTR* arg) { *arg = SysAllocString(L"My String"); }

现在 str 的内部 BSTR是真正的BSTR。当 CComBSTR 超出范围时,它将删除 str成员。

现在,如果您调用 get_Baf()在 &str 上,问题是 CComBSTR 不知道您正在更改字符串。所以你调用 get_Baf()像这样:
HRESULT get_Baf(BSTR* arg) { *arg = SysAllocString(L"My String"); }

现在 get_Baf()已覆盖 str 的原始值的内部 BSTR 没有任何人释放由 get_Bar() 分配的数据.

Ta da - 内存泄漏。

关于com - CComBSTR 的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1745472/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com