C++ C++;删除[]运算符混淆

C++ C++;删除[]运算符混淆,c++,delete-operator,C++,Delete Operator,我在学习指针。我被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]<<" "; 只有前两个元素被销毁。 我做错什么了吗?您的代码调用了一个未定义的行为,因为您试图访问已经释放的内存。任何事情都有可能发生。您所做的错事是试图在删除a

我在学习指针。我被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]<<" ";
只有前两个元素被销毁。
我做错什么了吗?

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

您所做的错事是试图在删除
a
后访问其内容。这会调用未定义行为(UndefinedBehavior,UB),意思是“一切都会发生”千万不要这样做,这是代码中值得崩溃的错误。


你所看到的结果只是“任何东西”的一个特殊特化。在另一个系统上运行此程序,或使用不同的编译器,或使用具有不同设置的同一编译器,很可能最终会执行其他操作。

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


但是,访问这样的内存会使您的程序变得非法:您的程序不再拥有该内存块,它属于其他代码或程序的另一部分。该内存的任何部分都可以随时被覆盖。此外,当您访问这样的内存时,您的程序可能会崩溃。

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


在其他任何一天,您都会看到崩溃。无效指针延迟异常。

@kr4lj:在这种情况下,没有什么要销毁的,因为数组包含整数——只有数组本身的内存被释放。如果数组包含对象,你会看到它们的析构函数被一个接一个地调用。我也这样做了,把前两个元素归零。您不能物理上删除内存位置:如果编译器使用零为空,则D只生成零,并发布供以后使用。
10621288 10617028 123 123 123 123 123 123 123 123 123 123