首页 文章

CRT内存泄漏检测未检测到内存泄漏

提问于
浏览
1

我遇到了问题,我的应用程序存在无限增长的内存泄漏,但未检测到 . 我做的非常简单,就是创建一个对象,在其上运行一个方法,然后删除该对象 . 每次执行此操作时,TaskManager中的内存使用量增长约50-100MB . 一些运行后,这耗尽了我的整个记忆 . 我通过多线程执行此操作,但没有静态变量,因此我的线程中的不同对象之间没有冲突 . 它们只使用其他对象的静态方法,这些方法不会修改除参数中传递的任何其他内存 - 因此它是线程安全的 . 我试图找出原因:

  • 使用crtdbg.h(CRT-Memeory-Leak-Detection),但是自我的应用程序启动以来只存在泄漏 - 它们将在关闭时被删除,并且它们不是那么大 .

  • 我正在寻找我继承的所有对象中的虚拟析构函数,但它们都没问题

我还可以尝试找出我的应用程序泄漏的位置?我在HEAP中找不到任何泄漏,除了可能导致STACK泄漏的析构函数问题之外我不知道任何其他原因(我的意思是一个对象不会破坏本地std :: string对象已在堆中分配空间) . 我不知道“STACK-Leaks”是否还有其他原因,但我知道在我的方法中,内存增长最多的部分,没有HEAP分配 .

2 回答

  • 1

    您可能希望使用更好,更强大的检漏仪 . 您可能还需要使用可在程序运行时在不同时间输出堆报告的检漏仪 . 最后,您应该考虑您的问题可能是由于堆碎片而不仅仅是泄漏 .

    您可以尝试免费使用Google的Visual Leak Detector .

    This question包含其他内存检查产品的列表,从基本到非常先进/昂贵 . CRTDBG是最低通用分母的解决方案;我对BoundsChecker好运,虽然它不是免费的 .

  • 1

    不知道你是如何使用CRTDBG库但它提供了很多好东西:

    http://msdn.microsoft.com/en-us/library/x98tx3cf.aspx

    您可以以分而治之的方式使用_CrtMemCheckpoint . 它允许您测量代码中两点之间的内存使用差异 . 使用多线程可能很困难 .

    另一个是启用了_CRTDBG_MAP_ALLOC的_CrtDumpMemoryLeaks(我认为无论如何在应用程序端执行),这应该显示内存分配的确切位置 .

    另一个提示是,您可能已经过度配置了CRTDBG,通过大量小分配可以创建巨大的内部存储器结构 .

    尝试关闭部分代码,并检查问题是否仍然存在 .

    如果您每天构建应用程序,请尝试运行以前的版本以查明问题出现的位置,然后比较源代码存储库中的更改 .

    ...

相关问题