0

我正在研究指针自动取款机。我对 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

4 回答 4

2

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

于 2013-07-07T15:53:31.003 回答
2

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

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

于 2013-07-07T15:53:40.263 回答
2

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

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

于 2013-07-07T15:55:05.047 回答
1

您的代码表现出未定义的行为。摧毁记忆与摧毁一本书或一个花瓶是不一样的:记忆并没有消失,它的一些内容可能保持不变。

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

于 2013-07-07T15:54:41.907 回答