2012-07-17 150 views
1

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

  • 使用crtdbg.h(CRT-Memeory气密性检测),但也有只因为我的应用程序的启动而存在泄漏 - 他们会在关机时被删除他们并不那么大。
  • 我一直在寻找,我继承的所有对象的虚析构函数,但它们都可以

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

+1

让我们看看创建对象的代码以及对象或指向对象的指针 – Mark 2012-07-17 14:42:52

+0

Obejct非常大,所以我不能发布整个代码 - 它是通过new进行分配的,并且使用delete进行了释放 - 您做了什么?想要看到确切的 - 每个新的有一个删除,每个新的[]有一个删除[] ... – DenisD 2012-07-17 14:53:14

+0

如果你只这么做,为什么不创建堆栈上的对象 - 所以不需要新的和删除 – Mark 2012-07-17 14:56:19

回答

1

您可能想要使用更好,更强大的检漏仪。您可能还需要使用能够在程序运行时的不同时间输出堆报告的泄漏检测器。最后,你应该考虑你的问题可能是由堆碎片造成的,而不仅仅是泄漏。

您可以尝试Visual Leak Detector这是免费的谷歌。

This question包含其他内存检查产品的列表,从基本到相当先进/昂贵。 CRTDBG是最常见的分母解决方案;我已经与BoundsChecker好运,尽管它不是免费的。

+0

但CRT泄漏检测器有什么不同 - 它有什么优势? CRT是否检测不到所有内容?为什么我应该使用虚拟泄漏检测器? – DenisD 2012-07-17 14:55:24

+0

我扩大了我的答案 – antlersoft 2012-07-17 15:23:46

+0

@DenisD:从Google页面:'主要区别是... Visual Leak Detector显示用于内存分配的完整调用堆栈已导致泄漏。“# – tinman 2012-07-17 15:44:02

1

不知道你如何应用CRTDBG库,但它提供了很多好吃的东西:

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

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

另一个是_CrtDumpMemoryLeaks(我认为它是在应用程序结束时执行的),并启用_CRTDBG_MAP_ALLOC,这应显示内存分配的确切位置。

另一个提示是,也许你有你的CRTDBG过度配置,有很多小的分配它可以创建巨大的内部内存结构。

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

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

...

+0

我使用_CrtDumpMemoryLeaks我在线程中运行的“主”对象被销毁,线程退出后。它没有显示这个对象留下的任何东西。 – DenisD 2012-07-17 15:44:37