【发布时间】:2010-06-25 14:21:29
【问题描述】:
我正在尝试查找内存泄漏问题。
我的项目是一个基于 ATL 的对话框项目,它使用 DirectShow 和标准库。
我的程序中总共有 45 个内存泄漏,每个都是 24 个字节。
我在我的 stdafx.h 中 #define'd _CRTDBG_MAP_ALLOC 等,以及 DEBUG_NEW 以获取每个内存泄漏的文件和行号。
但是,不会打印文件行号。内存块都是“普通”块,如下所示:
{180} normal block at 0x003E6008, 24 bytes long. Data: < > _> > W > A0 AE 3E 00 B0 5F 3E 00 A0 AE 3E 00 57 00 00 00
我尝试在 _tWinMain() 的开头添加以下行
_CrtSetBreakAlloc(180);
为了中断分配,但调试器根本没有中断。
谁能告诉我如何追踪难以捉摸的内存泄漏?
最后,这是我的 _tWinMain() - 我在退出前调用了 _CrtDumpMemoryLeaks()。
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow){
_CrtSetBreakAlloc(180);
HRESULT hRes = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
ATLASSERT(SUCCEEDED(hRes));
::DefWindowProc(NULL, 0, 0, 0L);
AtlInitCommonControls(ICC_BAR_CLASSES);
//HINSTANCE hInstRich = ::LoadLibrary(CRichEditCtrl::GetLibraryName());
hRes = _Module.Init(NULL, hInstance);
ATLASSERT(SUCCEEDED(hRes));
int nRet = Run(lpstrCmdLine, nCmdShow);
_Module.Term();
::CoUninitialize();
_CrtDumpMemoryLeaks();
return nRet;
}
【问题讨论】:
-
你在全局命名空间中有什么吗?有时,当您检查 memleaks 时,没有调用一些析构函数。另一种方法是用老式的方式来做,注释掉代码以本地化。
-
顺便说一句,是的,如果你有任何静态变量指向任何堆分配的东西,并且在转储泄漏之前没有明确删除它们,那么肯定会报告泄漏。
-
我会将其添加到回复中以进行格式化...
标签: c++ memory-leaks