第一行代码_CrtDumpMemoryLeaks()== 1?

时间:2010-11-17 13:32:05

标签: visual-c++ mfc memory-leaks

我正在开发一个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。

为什么程序早期我有内存泄漏?

3 个答案:

答案 0 :(得分:3)

您误解了返回值。 TRUE并不意味着内存泄漏,这意味着堆中有一些未释放的块,这可能也是程序中某些指针所指向的。这些对象可能由CRT启动代码和静态对象构造函数创建。

如果您仍然怀疑 - set an allocation hook并检查何时创建对象。要尽早做到这一点,你需要一个在启动时构造的对象 - 使用#pragma init_seg( compiler )

答案 1 :(得分:2)

C ++在调用main()方法之前初始化静态对象(如果是这种情况,则为WinMain)。

你在某处有静态物体吗?你是否使用Singleton来初始化一些从未被释放的对象?你是否使用了一些可以在你背后做到这一点的框架?

答案 2 :(得分:1)

如果你在静态初始化期间(在调用winmain之前发生了事情)分配内存,那么这些将显示为内存泄漏。

你可以尝试在HeapAlloc()上设置一个断点 - 你可能会看到在winmain之前被击中。