_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 在第一行代码?的主要内容,如果未能解决你的问题,请参考以下文章