Я анализирую дамп памяти, созданный debugdiag. Он показывает вызов метода CreateErrorinfo, который приводит к утечке памяти, как показано ниже,
Я использую правильные файлы карты для mydll и myanotherdll оба. В чем смысл CreateErrorInfo? как это приводит к утечке памяти?
Назначение источника функции
оператор mfc90u! новый + 33
mfc90u! CPlex :: Создать + 1f mfc90u! оператор 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
Это связано с не выпуском интерфейса? Интерфейс из 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
}
CreateErrorInfo создает экземпляр универсального объекта ошибки.
Эта функция возвращает указатель на общий объект ошибки, который вы можете использовать с QueryInterface в ICreateErrorInfo для установки его содержимого. Я считаю, что вы должны проверить состояние указателя ICreateErrorInfo для более подробной информации в вашем коде.