我正在分析debugdiag创建的内存转储。它显示了CreateErrorinfo方法调用,导致内存泄漏,如下所示,
我正在为mydll和myanotherdll使用正确的地图文件。 CreateErrorInfo是什么意思?它是如何导致内存泄漏的?
功能源目的地
mfc90u!operator new + 33
mfc90u!CPlex :: Create + 1f mfc90u!operator new
KERNEL32!TlsSetValueStub
KERNEL32!TlsSetValueStub
的 MYANOTHERDLL <!强> CreateErrorInfo + 188e2
MYDLL!MyClas :: OnTimer + a3 ...... \ myfile.cpp @ 4639
MYDLL!CMainFrame :: OnTimer + 71 ...... \ mainfrm.cpp @ 1246
mfc90u!的CWnd ::的OnWndMsg + 407
mfc90u!AfxCallWndProc + A3
USER32!MDIClientWndProcW
mfc90u!__ sse2_available_init + 657B
mfc90u!的CWnd :: WindowProc中+ 24
mfc90u!AfxCallWndProc + A3
mfc90u!AfxWndProc + 37 mfc90u!AfxCallWndProc
mfc90u!AfxWndProcBase + 56 mfc90u!AfxWndProc
mfc90u!AfxWndProcBase
答案 0 :(得分:1)
这与不发布接口有关吗?来自CreatorErroInfo的接口必须由客户发布:
ICreateErrorInfo* pErrorInfo = nullptr;
HRESULT hr = ::CreateErrorInfo(&pErrorInfo);
if (pErrorInfo)
{
pErrorInfo->Release();
}
使用ATL的智能指针更好:
CComPtr<ICreateErrorInfo> ptrErrorInfo;
HRESULT hr = ::CreateErrorInfo(&ptrErrorInfo);
if (ptrErrorInfo)
{
//no release necessary
}
答案 1 :(得分:0)
CreateErrorInfo创建一个通用错误对象的实例。
此函数返回指向通用错误对象的指针,您可以将其与ICreateErrorInfo上的QueryInterface一起使用来设置其内容。我相信您应该检查ICreateErrorInfo指针的状态,以获取代码中的更多详细信息。