2012-01-11 96 views
0

可能重复:
C++ delete - It deletes my objects but I can still access the data?
Why doesn't delete destroy anything?如何删除动态数组指针正确

我创建动态数组,和我的附加价值值像这样的数组。

int *pArr; 
pArr = new int[10]; 

for(int i=0;i<10;i++){ 
    pArr[i] = i+2; 
} 

delete[] pArr; 

// After deletion I can find the value of the array items. 
cout << pArr[5] << endl; 

正如你在上面的代码和最后一行中看到的,我可以输出数组中的第五个元素而没有任何问题。 与那应该是数组已被删除。

+12

你误解了'delete'的含义。内存不是GONE,你刚刚告诉C++你不会再使用它了。然后你破坏了你的诺言。 – 2012-01-11 16:27:33

+0

给予+1的理由为什么c和C++不适合孩子。 – 2012-01-11 16:29:27

+3

[你的圣经没有被触及。](http://stackoverflow.com/a/6445794/596781) – 2012-01-11 16:33:14

回答

1

要说明的是内存可以再次使用,考虑这个扩展你的代码:

int *pArr; 
pArr = new int[10]; 

for(int i=0;i<10;i++){ 
     pArr[i] = i+2; 
} 

delete[] pArr; 

int *pArr2; 
pArr2 = new int[10]; 

for(int i=0;i<10;i++){ 
     pArr2[i] = (2*i)+2; 
} 

cout << pArr[5] << endl; 

为我打印出12。即实际上来自pArr2[5]的值。或者至少我应该说这是为我的机器使用我的特定编译器&版本等。正如其他人指出它是未定义的行为。但是希望我的例子能够向你展示至少一种未定义的行为。

0

您确实删除了它。

然后,你调用未定义的行为,发现内存仍然存在(*),并没有归零 - 像valgrind这样的工具仍然会显示它是一个错误,但它是。


(*)通过“仍然存在”我的意思是“是的进程访问” - 它可以包含任何东西,可是偏偏没有被覆盖... 尚未

1

一旦你delete[]数组,并仍然尝试访问数组的元素,它是未定义的行为和任何行为是可能的。

0

是的,这可能工作,但不是保证工作。删除[]只会使内存无效,但不会将其归零。您正在引用的内存在此时无效。所以,不要做:)