使用delete []p时出现堆的损坏问题。

4
使用delete []p时,会导致堆的破坏。
Rectangle *p[3];

for (int i = 0; i<3; i++)
  p[i] = new Rectangle();

p[0]->set(3, 4); 
p[1]->set(10, 8); 
p[2]->set(5, 6); 

for(int i=0; i < 3; i++) 
    cout << "Area is " << p[i]->area() << endl; 

delete []p; 

我将delete []更改为

for (int i = 0; i<3; i++)
    delete p[i]; 

它可以工作,但为什么我不能使用delete []p?delete []p只会删除p[0]吗?[]在delete []p中代表什么?

在这个例子中,为什么你要使用指针而不是Rectangle p [3]呢? - Casey
3个回答

9

delete []只能用于使用new []进行分配的内存,delete只能在使用new之后使用。

这就是C++的工作原理。如果你想简单地分配一个由三个Rectangle组成的数组,请使用以下代码:

Rectangle *p = new Rectangle[3];

...

delete [] p;

即使在这种情况下,您仍需要删除单个“p”。否则,将会出现内存泄漏。 - unxnut
@unxnut 如果矩形是一个结构体并且不包含任何引用类型,那该怎么办? - Sam I am says Reinstate Monica
@unxnut 你确定吗?我一直认为你平衡使用 new/delete 和 new[]/delete[]。难道我要重新检查我的代码并使用边界检查器了吗? - Bathsheba
@nightcracker 循环中 p 的分配将需要平衡每个 delete - unxnut
@unxnut:当然,但我描述的情况是使用new[]而不是new。而且提问者已经意识到他需要为每个数组成员使用delete - orlp

6

delete [] x 用于动态分配的数组,而不是指向动态分配元素的指针数组,这正是您所拥有的。

Rectangle* pA = new Rectalgle[3]; // dynamically allocated array
....
delete [] pA;  // OK

Rectangle* p[3]; // array of pointers. 
// Each pointer must be dealt with individually.
delete p[0]; // Might be OK, if p[0] points to dynamically allocated Rectangle.

-1

p是一个指针数组,当你只删除[] p时,你只删除了指针数组而没有删除它们所指向的对象。因此,你需要遍历整个数组,删除每个指针创建的对象。使用二维动态数组时也会出现同样的情况。


不行。为什么大家都这么困惑?p是一个指针的栈分配数组。不要试图删除它。 - Bathsheba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接