【问题标题】:XCode not showing leaks in C++ programXCode 未显示 C++ 程序中的泄漏
【发布时间】:2014-07-31 21:27:15
【问题描述】:

我用c++写了下面一段代码作为xcode命令行工具

int * num = new int[100];

num[4] = 5;
num = NULL;

cout << "leaked" << endl;

string c; cin >> c;

return 0;

但是,当使用带有 Leaks 模板的 Instruments 进行分析时,它不会显示任何内存泄漏,尽管在等待输入时显然应该有一个。

【问题讨论】:

    标签: c++ xcode memory-leaks instruments xcode-instruments


    【解决方案1】:

    当您为分析进行编译时,编译器会进行优化。其中一项优化是死存储优化:

    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 发生了什么?

    整个分配都得到了优化,因为编译器找到了一种无需分配任何东西就能获得相同结果的方法。编译器很棒,不是吗?

    【讨论】:

    • 所以为避免这种情况,我应该在将其分配为 NULL 后从 num 读取?
    • @user2612743:这可能足以让变量保持活动状态。虽然这里的教训是你不应该相信你从玩具程序中得到的结果:-)
    猜你喜欢
    • 2011-10-10
    • 1970-01-01
    • 2013-01-11
    • 2011-10-07
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    相关资源
    最近更新 更多