我正在分析debugdiag创建的内存转储。它显示了CreateErrorinfo方法调用,该调用导致如下所示的内存泄漏,

我正在为mydll和myanotherdll使用正确的映射文件。 CreateErrorInfo是什么意思?它如何导致内存泄漏?

函数源目的地
mfc90u!operator new + 33
mfc90u!CPlex :: Create + 1f mfc90u!operator新
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

最佳答案

这与不释放接口有关吗?客户端必须释放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
}

09-30 00:21