2013-07-07 75 views
0

我正在学习指针atm。我对delete []运算符感到困惑。 下面是一个例子:C++ 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[]经营者应destory阵列中的所有对象。 但我的输出是这样的:

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

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

回答

2

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

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

+0

@ kr4lj:在这种情况下,没有什么可以销毁的,因为数组包含整数 - 只有数组本身的内存被释放。如果数组包含对象,您会看到它们的析构函数被逐个调用。 – Jon

+0

我也是这样做的,得到了​​前两个元素归零。你不能在物理上弄到一个内存位置:如果零是编译器和释放以供以后使用,则D只会变为零。 –

2

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

1

您的代码表现出未定义的行为。销毁内存与销毁书籍或花瓶并不相同:内存不会消失,其中的一些内容可能保持不变。

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

2

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

在任何其他的日子里,你会看到一个崩溃。指针失效异常无效。