为什么Xcode + Instrument Leaks在简单的C ++程序中没有检测到这种泄漏

时间:2010-09-14 01:43:33

标签: c++ xcode memory-leaks

我在Xcode中的一个简单的C ++控制台项目中有以下内容。 当我使用仪器Leaks运行时,Xcode不会标记任何内存泄漏 甚至认为有一个明显的。到底是怎么回事 ?有什么帮助吗?

#include <iostream>

int main (int argc, char * const argv[]) {
    // insert code here...

    int *x = new int[20];
    x[0] = 10;
    std::cout << "Hello, World!\n";

    return 0;
}

1 个答案:

答案 0 :(得分:7)

您的代码中没有泄漏。要发生泄漏,您必须丢失必须分配内存的引用。在您的情况下,您不再使用分配的内存,但仍然保留对它的引用。因此,Leaks认为您可能可能稍后在某个时候释放它,并且不认为它是泄漏。 (提醒一下,泄漏就是在你分配内存时,然后处理指针而不释放内存。)

这个程序应该让Leaks生气:

int main()
{
    int* foo = new int[10];
    foo = NULL;
    sleep(60);
}

如您所见,当new int[10]foo覆盖时,NULL返回的内存地址无可挽回地丢失。因此,Leaks应该发现它。

泄漏不是一种静态分析工具。它不知道你要用你的指针做什么。它所知道的是,每个已分配内存块仍然在某处被引用。

泄漏也不是一个实时工具。一旦发生泄漏,它就不会发现泄漏。相反,每10秒左右,它会冻结程序,扫描其内存并尝试查找对其所有已分配内存块的引用。如果没有找到任何特定块,则将其标记为泄漏。因此,如果你的程序执行时间不到10秒,那么泄漏显然不会有任何帮助。