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

Posted

技术标签:

【中文标题】_CrtDumpMemoryLeaks( ) == 1 在第一行代码?【英文标题】:_CrtDumpMemoryLeaks( ) == 1 on first line of code? 【发布时间】:2010-11-17 13:32:05 【问题描述】:

我正在开发一个 MFC Visual C++ 项目。据我从MSDN 了解到,当内存泄漏时,_CrtDumpMemoryLeaks() 应该返回TRUE

在注意到它 TRUE 后,我试图在代码中找到它变为TRUE 的第一个点。显然,它从一开始就是正确的。如果我点击 F10(step-over)开始调试程序,并在监视窗口中输入_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。

为什么我在程序的早期就出现了内存泄漏?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

你在某处有静态对象吗?你是否使用 Singleton 来初始化一些从未被释放的对象?您是否使用了可以在您背后执行此操作的框架?

【讨论】:

【参考方案3】:

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

您可以尝试在 HeapAlloc() 上放置一个断点 - 您可能会看到它在 winmain 之前被命中。

【讨论】:

以上是关于_CrtDumpMemoryLeaks( ) == 1 在第一行代码?的主要内容,如果未能解决你的问题,请参考以下文章

使用堆调试 MS VC++ 2005

高分求助!!!C内存泄露检测问题

英语高手请进

简易先进先出队列-自用

函数参数

多重背包