-2

我在我的 Xcode 4.3.2 中关闭了自动引用计数 (ARC),并认为我掌握得很好。然后我写了这个小程序:

int main()
{
    int *a = new int(3);
    delete a;
    printf("%i",*a);
    return 0;
}

这是打印 3,但它应该打印垃圾。看起来编译器会处理我所有的内存分配,我不希望它这样做。我该怎么做才能删除它?

4

1 回答 1

2

你用 new 给你的程序一个堆上的地址。它恰好是该地址处值为 3 的整数。当您使用 delete 释放该堆区域时,它不会立即设置为某个垃圾值,它仍然包含 3。您的打印语句转到地址 a 并尝试打印那里的整数,它找到 3 并打印它。

如果在 xcode 中可行,您可以尝试添加编译器警告,我知道 gcc 和其他命令行编译器提供此功能,以避免在程序对您大喊大叫的情况下发生这些令人困惑的未定义行为。

于 2012-05-17T19:49:30.477 回答