c++ - GCC内存泄漏检测相当于微软crtdbg.h?

标签 c++ c xcode gcc memory-leaks

在多年使用 Visual Studio 中的 Microsoft MSVC 编译器开发通用 C++ 库之后,我们现在将其移植到 Linux/Mac OS X(为我们祈祷)。我已经习惯并且非常喜欢 MSVC 中简单的内存泄漏检测机制:

#ifdef DEBUG
    #define _CRTDBG_MAP_ALLOC
    #define NEW   new( _NORMAL_BLOCK, __FILE__, __LINE__)
    #include <stdlib.h>
    #include <crtdbg.h>
#else
    #define NEW   new
#endif

每个内存分配都是使用这个 NEW 宏完成的。每当使用我们库的进程终止时,控制台上都会报告任何内存泄漏(尚未解除分配的 block )以及最初分配内存的文件和行#。

我喜欢的部分是我不必主动“使用性能工具运行”或以其他方式表明我正在寻找泄漏。在常规开发过程中,每次进程终止时都会向我报告泄漏。

现在我们正在转向 GCC 世界,我发现内存泄漏检测工具(其中许多非常复杂)要求我明确指出我处于泄漏搜寻模式。我的 IDE 是 Xcode,我研究了一些分配/泄漏检测工具(如 Instruments 和 MallocDebug),但我承认我还没有花时间完全了解它们。我一直因为我必须提前指定我正在寻找泄漏而不是自动收到警报这一事实而感到厌烦。

我使用的是 Xcode 3.2,听说现在与静态分析工具进行了很好的集成,但我还是没有对此进行研究。我正在寻找一些关于我的选择的想法。 GCC 和/或 Xcode 中是否有类似的机制?是否有一个简单的第三方库或工具可以执行我所知道和喜爱的非常基本的功能?还是我应该接受它并学习新的做事方式?

最佳答案

您有多种选择。

首先,也是最常见的,您可以在 Valgrind 等工具下运行您的应用程序。 .这应该指出一些内存滥用,例如 NULL 指针读取和写入以及内存泄漏。 Valgrind 套件中有许多可用的工具,因此请务必查看它们。

其次,您始终可以使用使用 LD_PRELOAD 的库。诡计。基本上,LD_PRELOAD 技巧允许 DLL 注入(inject),这意味着可以创建工具来帮助跟踪应用程序中的内存使用情况,而无需更改任何内容。您会发现 dmalloc 等工具和 efence在他们提供的调试工具中相当广泛。

最后,最近的 GCC 版本包括一个名为 Mudflap 的工具。 .这基本上使用函数检测来包装与 dmalloc、efence 和 Valgrind 相同的内存函数的调用。该程序会明显变慢,并且可以在运行时进行调整,尽管它看起来仍然很有潜力。

我已经使用了所有这三个,发现 Valgrind 非常有用。我也一直对使用 Mudflap 非常感兴趣,虽然我还不能。

关于c++ - GCC内存泄漏检测相当于微软crtdbg.h?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1761125/

相关文章:

c++ - 为什么叫运算符重载呢?

c++ - RtAudio + Qt : duplex not working with RME Fireface on Linux

c - 在 C 程序中可能是 "force"UTF-8 吗?

python - 在 C 代码中找不到库

iphone - 如何将本地 jpeg 或 png 图像文件加载到 iPhone 应用程序中?

objective-c - 除非单击,否则 UIButton 标题不会出现

c++ - 在 C++ 中将位序列转换为 uint32_t

在低级文件复制程序中使用 Gotoxy() 时生成代码错误

ios - 升级到 Xcode 6.1.1,现在 NSData(contentsOfURL :) always returns nil

c++ - std::normal_distribution<int> 运行时错误 "Integer division by zero"