我正在开发一个MFC Visual C ++项目。据我所知MSDN,_CrtDumpMemoryLeaks()
应在内存泄漏时返回TRUE
。
注意到 为TRUE后,我试图找到代码中第一个为TRUE的点。显然,它从一开始就是正确的。如果我单击F10(步进)开始调试程序,并在监视窗口中输入_CrtDumpMemoryLeaks()
,它甚至在第一行代码之前,在程序的入口点显示为TRUE:
extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine, int nCmdShow)
#pragma warning(suppress: 4985)
{
// call shared/exported WinMain
return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}
另外,我推测可能在那时没有初始化调试工具,并且TRUE是错误的。所以我在OnInitDialog()
函数的第一行设置了一个断点,值也是TRUE。
为什么程序早期我有内存泄漏?
答案 0 :(得分:3)
您误解了返回值。 TRUE
并不意味着内存泄漏,这意味着堆中有一些未释放的块,这可能也是程序中某些指针所指向的。这些对象可能由CRT启动代码和静态对象构造函数创建。
如果您仍然怀疑 - set an allocation hook并检查何时创建对象。要尽早做到这一点,你需要一个在启动时构造的对象 - 使用#pragma init_seg( compiler )
。
答案 1 :(得分:2)
C ++在调用main()方法之前初始化静态对象(如果是这种情况,则为WinMain)。
你在某处有静态物体吗?你是否使用Singleton来初始化一些从未被释放的对象?你是否使用了一些可以在你背后做到这一点的框架?
答案 2 :(得分:1)
如果你在静态初始化期间(在调用winmain之前发生了事情)分配内存,那么这些将显示为内存泄漏。
你可以尝试在HeapAlloc()上设置一个断点 - 你可能会看到在winmain之前被击中。