Для демонстрации я создал это простое консольное приложение:
#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 никогда не удаляют.
Leaks Instrument выполняет снимки с заданной частотой. По умолчанию это значение «каждые 10 секунд». Ваша программа завершается до 10 секунд. Таким образом, утечка никогда не собирается. Таким образом, вы должны приостановить исполнение после iPerson
вышла из области видимости для обнаружения этой утечки. Кроме того, если вы просто добавите sleep
пока на этот указатель все еще ссылаются в стеке или в регистре, это не будет утечкой.
Я решил это:
Затем на основе ответа Джастина и этот вопрос, Я должен был изменить свой код следующим образом:
#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
, Инструменты не улавливают все утечки (в зависимости от того, где вы положили sleep
команды. Странный.
Вы могли бы взглянуть на Советы по улучшению обнаружения утечек из библиотеки разработчиков Mac.
Cppcheck инструмент статического анализа для кода C / C ++ также может помочь. Для приведенного вами примера он находит:
#>cppcheck so_code.cpp
Checking so_code.cpp...
[so_code.cpp:15]: (error) Memory leak: iPerson