CComBSTR 内存泄漏

发布于 2024-08-11 00:32:11 字数 158 浏览 7 评论 0原文

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

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

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

I have read that the following code causes memory leak. But did not understand why.

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

How does it cause a leak when we are not allocating anything?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

昔日梦未散 2024-08-18 00:32:11

它会泄漏,因为 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 成员。

现在,如果您对 &str 调用 get_Baf() ,问题是 CComBSTR 不知道您正在更改字符串。所以你像这样调用 get_Baf()

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

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

Ta da - 内存泄漏。

It leaks because get_Bar() and get_Baf() don't know that you're using a CComBSTR.

When you take the address of a CComBSTR what you're actually passing to the underlying object is a pointer to the CComBSTR's BSTR member.

Breaking down the sequence:

CComBSTR str;

This initializes the internal BSTR to NULL.

pFoo->get_Bar(&str);

get_Bar() sees a BSTR* and fills it with actual data. Like this:

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

Now the internal BSTR of str is a real BSTR. When CComBSTR goes out of scope it will delete the str member.

Now if you call get_Baf() on &str the problem is that the CComBSTR doesn't know that you are changing the string. So you call get_Baf() like this:

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

Now get_Baf() has overwritten the original value of str's internal BSTR without anyone freeing the data that was allocated by get_Bar().

Ta da - Memory leak.

清风夜微凉 2024-08-18 00:32:11

您可能在这个 Microsoft 页面上阅读到它:

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

内存泄漏问题

将初始化的 CComBSTR 的地址作为 [out] 参数传递给函数会导致内存泄漏。

CComBSTR 对象正在内部分配内存。显然存在不释放它的情况。

This Microsoft page is probably the where you read about it:

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

Memory Leak Issues

Passing the address of an initialized CComBSTR to a function as an [out] parameter causes a memory leak.

The CComBSTR object is allocating memory internally. Evidently there are cases where it doesn't release it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文