如何正确删除动态数组指针

时间:2012-01-11 16:25:13

标签: c++

  

可能重复:
  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;

正如您在上面的代码和最后一行中看到的那样,我可以毫无问题地输出数组中的第五个元素。 据说这个数组已被删除。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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]的值。或者至少我应该说我的机器使用我的特定编译器&amp;其他人已经指出它是未定义的行为。但希望我的例子向您展示至少一种未定义的行为。

答案 2 :(得分:0)

你确实删除了它。

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


(*)“仍然存在”我指的是“进程可以访问” - 它可以包含任何内容,但恰好不会被覆盖......

答案 3 :(得分:0)

是的,这可能有效,但保证无效。删除[]仅使内存无效,但不会使其归零。此时您引用的内存无效。所以不要这样做:)