C++ 列表“;“冷”;存储区

C++ 列表“;“冷”;存储区,c++,memory-leaks,C++,Memory Leaks,我正试图找出一个服务器软件中一个看起来像内存泄漏的非常逃避的bug,但是memcheck根本没有帮助。我的猜测是,已经实例化但从未删除的内存确实没有泄漏,因此有一个对它的引用,但现在对程序没有用处,应该删除。 是否有一个工具可以计算内存中的访问,而不是引用,从而评估堆中对象的有效使用情况?这个工具(可视泄漏检测器)可能会对您有所帮助。 它是免费的 我最终实现了自己的工具。 我的方法与我的初衷略有不同:我写了一篇文章。它钩住malloc、realloc和free,并维护一个活动的malloc内存块

我正试图找出一个服务器软件中一个看起来像内存泄漏的非常逃避的bug,但是memcheck根本没有帮助。我的猜测是,已经实例化但从未删除的内存确实没有泄漏,因此有一个对它的引用,但现在对程序没有用处,应该删除。 是否有一个工具可以计算内存中的访问,而不是引用,从而评估堆中对象的有效使用情况?

这个工具(可视泄漏检测器)可能会对您有所帮助。 它是免费的


我最终实现了自己的工具。 我的方法与我的初衷略有不同:我写了一篇文章。它钩住malloc、realloc和free,并维护一个活动的malloc内存块列表。无论何时向应用程序发送SIGUSR1,它都会将其信息转储到文件中,并将其作为表达式进行计算。Mathematica笔记本最终提供了一些非常有用的图表:得分最高的实例,以及一个完整的概述。有了这些工具,我只需将鼠标悬停在第二张图中最胖、最远离中心绿点的地方,瞧,我有了一个地址,它实例化了大量未泄漏但无用的内存

附言。
在第二个图中可以看到的循环调用肯定是libc的backtrace()中的一个bug。

Valgrind应该将从未释放的内容报告为“仍然可以访问”;请参阅。@oli-您可能希望将您的评论作为答案发布,以便将其标记为已接受。不管怎样,它看起来对我来说是正确的答案。我已经用这个程序运行了memcheck,但它没有显示任何内容。它看起来像一个普通的泄漏检测器,正如我所说的,我的问题是,使用中的额外内存在技术上没有泄漏,因为仍然有对它的引用。另外,我正在与gcc合作。我很惊讶valgrind没有做你想要的事情,valgrind没有为我发现内存泄漏。这个bug非常难以捉摸,还有另一个原因:另一个人已经找到了一种方法在他的构建中可靠地触发它,但这种方法对我不起作用(当然是同一个新的未触及的源代码)。所以memcheck没有为我找到任何明显的信息,但这家伙告诉我他确实运行了memcheck,但它没有返回任何信息,我没有理由认为他做错了什么。图表中显示的数据也来自他的体型。我怀疑这与比特有关,他构建了32位可执行文件,以便能够在任何服务器上共享相同的构建,而我只构建了64位可执行文件。