我在c ++
中将以下代码编写为xcode命令行工具int * num = new int[100];
num[4] = 5;
num = NULL;
cout << "leaked" << endl;
string c; cin >> c;
return 0;
但是,当使用带有Leaks模板的Instruments进行性能分析时,它不会显示任何内存泄漏,尽管在等待输入时应该有一个明显的内存泄漏。
答案 0 :(得分:3)
编译以进行性能分析时,编译器会进行优化。其中一个优化是死区优化:
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
发生了什么?
整个分配已经过优化,因为编译器想出了一种在不分配任何东西的情况下获得相同结果的方法。编译器很棒,不是吗?