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

use*_*536 2 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;
}
Run Code Online (Sandbox Code Playgroud)

zne*_*eak 7

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

这个程序应该让Leaks生气:

int main()
{
    int* foo = new int[10];
    foo = NULL;
    sleep(60);
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,new int[10]foo被覆盖时,返回的内存地址会无可挽回地丢失NULL.因此,Leaks应该发现它.

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

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