为了演示,我创建了这个简单的控制台应用程序:
#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永远不会被删除。
答案 0 :(得分:1)
我已经解决了这个问题:
然后根据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
,那么它就不会泄漏。