【问题标题】:C++ delete[] operator confusion [duplicate]C ++ delete []运算符混淆[重复]
【发布时间】:2013-07-05 00:27:59
【问题描述】:

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

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

【问题讨论】:

    标签: c++ delete-operator


    【解决方案1】:

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

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

    【讨论】:

    • @kr4lj:在这种情况下,没有什么可破坏的,因为数组包含整数——只有数组本身的内存被释放。如果数组包含对象,您会看到它们的析构函数被一一调用。
    • 我也做了同样的事情,将前 2 个元素归零。您不能在物理上删除内存位置:D 如果零对于编译器为 null 并释放以供以后使用,则只会将其设为零。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2011-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-06
          • 2014-02-08
          • 1970-01-01
          • 1970-01-01
          • 2013-03-12
          相关资源
          最近更新 更多