2

为了演示,我创建了这个简单的控制台应用程序:

#include <iostream>

class Person {
public:
    int mAge;
};

int main(int argc, const char * argv[])
{
    Person *iPerson = new Person();
    iPerson->mAge = 15;

    std::cout << "Age: " << iPerson->mAge;
    return 0;
}

现在我知道 Valgrind 和 CPP Check 会在此处识别泄漏,但测试 Apple 的仪器时,当我分析此代码时,我看不到任何泄漏。尽管 iPerson 从未被删除。

4

3 回答 3

1

我已经解决了:

  • 我不得不将快照间隔设置为 1 秒。
  • 我必须禁用(设置为无)发布版本的优化(已完成分析)。

然后根据贾斯汀的回复和这个问题,我不得不像这样修改我的代码:

#include <iostream>
#include <unistd.h>

class Person {
public:
    int mAge;
};

void CreateLeaks()
{
    // All three lines will generate a leak.
    Person *iPerson = new Person();
    iPerson = new Person();
    iPerson = new Person();
}

int main(int argc, const char * argv[])
{
    CreateLeaks();

    sleep( 2 );
    return 0;
}

仍然有一些奇怪的事情发生。例如,如果您开始添加sleep(2)within CreateLeaks,则 Instruments 不会捕获所有泄漏(取决于您放置sleep命令的位置。奇怪。

于 2012-11-12T23:20:42.533 回答
0

您可以从 Mac 开发人员库中查看改进泄漏检测的技巧。

C/C++ 代码的Cppcheck静态分析工具也可能有所帮助。对于您提供的示例,它发现:

#>cppcheck  so_code.cpp
Checking so_code.cpp...
[so_code.cpp:15]: (error) Memory leak: iPerson
于 2012-11-11T06:25:37.390 回答
0

Leaks Instrument 以预定义的频率执行快照。默认情况下,该值为“每 10 秒”。您的程序在 10 秒前完成。因此,泄漏永远不会被收集。因此,您必须在超出范围后暂停执行iPerson,以便检测到该泄漏。此外,如果您只是添加一段sleep时间,该指针仍然在堆栈或寄存器中被引用,那么它不会是泄漏。

于 2012-11-11T06:55:54.183 回答