程序终止时,仪器不会捕获未删除的对象

时间:2012-11-11 01:46:58

标签: c++ xcode memory-leaks instruments xcode4.5

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

#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永远不会被删除。

3 个答案:

答案 0 :(得分:1)

我已经解决了这个问题:

  • 我必须将快照间隔设置为1秒。
  • 我必须禁用(设置为None)发布版本的优化(为其进行性能分析)。

然后根据justin的回复和this question,我不得不修改我的代码:

#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)中添加CreateLeaks,则Instruments不会捕获所有泄漏(取决于您放置sleep命令的位置。奇数。

答案 1 :(得分:0)

您可以查看Mac开发人员库中的Tips for Improving Leak Detection

用于C / C ++代码的

Cppcheck静态分析工具也可能有所帮助。对于您提供的示例,它会找到:

#>cppcheck  so_code.cpp
Checking so_code.cpp...
[so_code.cpp:15]: (error) Memory leak: iPerson

答案 2 :(得分:0)

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