gpt4 book ai didi

c++ - CComPtr 内存泄漏

转载 作者:行者123 更新时间:2023-11-28 04:18:47 25 4
gpt4 key购买 nike

我使用 crtdbg 检测泄漏位置,在调用 new 时出现内存泄漏

CComPtr<IDBColumnInfo> m_spColumnInfo
CComPtr<CDBColumnInfo> spResult = new CDBColumnInfo(); //Memory leak here
//another logic come here to set data to spResult
//another logic come here to set data to spResult
//another logic come here to set data to spResult
m_spColumnInfo = static_cast<IDBColumnInfo*>(spResult.Detach());
spResult.Release();

spResult有什么步骤需要处理吗?

最佳答案

您有内存泄漏,因为您对 CDBColumnInfo 对象的引用计数管理不当。

当您初始化 spResult 时,对象的引用计数被初始化为 1。当您调用 spResult.Detach() 时,对象的引用计数仍然为 1,因为 Detach() 不会递减它。当分离的指针随后被分配给 m_spColumnInfo 时,对象的引用计数增加到 2。当稍后释放 m_spColumnInfo 时,它将对象的重新计数减少到 1,并且对象被泄露了。

你根本不应该分离 spResult。按原样将其分配给 m_spColumnInfo,这会将 refcount 增加到 2,然后让 spResult 正常超出范围,将 refcount 减少到 1,留下 m_spColumnInfo 具有唯一的事件引用。当稍后释放 m_spColumnInfo 时,refcount 将递减为 0,并且该对象将被释放。

您根本不应该尝试手动管理引用计数。这违背了使用 CComPtr 的全部目的。

CComPtr<IDBColumnInfo> m_spColumnInfo;

...

{
CComPtr<CDBColumnInfo> spResult = new CDBColumnInfo();
//set data to spResult
m_spColumnInfo = spResult;
}

此外,请注意,您的函数根本没有调用 CoInitialize()CoUninitialize() 的业务!您需要从您的函数中删除这些调用(特别是因为您的函数甚至不会在大多数退出函数的代码路径中调用 CoUninitialize())。这些调用不是您的函数的责任。调用您的函数的线程有责任决定它需要如何为自己初始化 COM。这些 COM 函数每个线程应该只调用一次,而不是每个用户函数。

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

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