Instruments не улавливает неосуществленные объекты при завершении программы

Для демонстрации я создал это простое консольное приложение:

#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 никогда не удаляют.

2

Решение

Leaks Instrument выполняет снимки с заданной частотой. По умолчанию это значение «каждые 10 секунд». Ваша программа завершается до 10 секунд. Таким образом, утечка никогда не собирается. Таким образом, вы должны приостановить исполнение после iPerson вышла из области видимости для обнаружения этой утечки. Кроме того, если вы просто добавите sleep пока на этот указатель все еще ссылаются в стеке или в регистре, это не будет утечкой.

0

Другие решения

Я решил это:

  • Я должен был установить интервал снимка до 1 секунды.
  • Мне пришлось отключить (установить None) оптимизацию для версии выпуска (для которой профилирование сделано).

Затем на основе ответа Джастина и этот вопрос, Я должен был изменить свой код следующим образом:

#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 команды. Странный.

1

Вы могли бы взглянуть на Советы по улучшению обнаружения утечек из библиотеки разработчиков Mac.

Cppcheck инструмент статического анализа для кода C / C ++ также может помочь. Для приведенного вами примера он находит:

#>cppcheck  so_code.cpp
Checking so_code.cpp...
[so_code.cpp:15]: (error) Memory leak: iPerson
0
По вопросам рекламы [email protected]