C ++ delete []运算符混乱

时间:2013-07-07 15:51:33

标签: c++ delete-operator

我正在研究指针atm。我对delete []运算符感到困惑。 这是一个例子:

int* a = new int[12];

for (int i=0; i<12; i++)
    a[i]=123;

delete[] a;

for (int i=0; i<12; i++)
  cout <<a[i]<<" ";

如果我得到了正确的话,delete[]运算符应该会破坏数组中的所有对象。 但我的输出是:

10621288 10617028 123 123 123 123 123 123 123 123 123 123

只有前两个元素被销毁。 我做错了什么?

4 个答案:

答案 0 :(得分:2)

您的代码调用未定义的行为,因为您尝试访问已释放的内存。任何事情都可能发生。

答案 1 :(得分:2)

你做错了就是在删除a之后尝试访问{{1}}的内容。这会调用未定义的行为(UB),这意味着“任何事情都会发生”。 你绝不能这样做,这是代码中一个值得崩溃的错误。

您看到的结果只是“任何事物”的一个特殊专业。在另一个系统上运行该程序,或者使用不同的编译器,或者使用具有不同设置的相同编译器,可能最终会做其他事情。

答案 2 :(得分:2)

你很幸运输出仍然显示数据确实存在。但你的理解是正确的。您必须执行删除[] a。

在其他任何一天你都会看到崩溃。指针引用异常无效。

答案 3 :(得分:1)

您的代码显示未定义的行为。摧毁记忆与摧毁一本书或一个花瓶并不相同:记忆不会消失,而且它的一些内容可能保持不变。

但是,访问此类内存会使您的程序失效:您的程序不再拥有该块内存,它属于某些其他代码或程序的其他部分。任何时候都可以覆盖该内存的任何部分。此外,当您访问此类内存时,您的程序可能会崩溃。