Я написал следующий фрагмент кода как инструмент командной строки xcode на c ++
int * num = new int[100];
num[4] = 5;
num = NULL;
cout << "leaked" << endl;
string c; cin >> c;
return 0;
Однако при профилировании с использованием инструментов с шаблоном Leaks он не показывает никаких утечек памяти, хотя он явно должен быть, пока он ожидает ввода.
Когда вы компилируете для профилирования, компилятор выполняет оптимизацию. Одна из этих оптимизаций — оптимизация мертвого хранилища:
num = NULL; // The optimizer deleted this operation
Обычно, почему вы заботитесь, если num
на самом деле равен NULL
? Поскольку вы никогда не читаете значение num
, у вас нет возможности узнать, действительно ли хранится компилятор NULL
там не смотря на сборку вывода. Таким образом, компилятор не мешает на самом деле писать NULL
в это место.
Я сделал тест:
#include <unistd.h>
int main()
{
int *num = new int[100];
num[4] = 5;
num = NULL;
sleep(1);
return 0;
}
Сборка (пролог и эпилог опущены для краткости):
movl $1, %edi
callq _sleep
xorl %eax, %eax
Подожди чертову минуту, что случилось с new int[100]
а также num[4] = 5
?
Все распределение было оптимизировано, потому что компилятор нашел способ получить тот же результат, ничего не выделяя. Компиляторы потрясающие, не так ли?