使用delete [] p时堆的损坏;

时间:2013-06-20 14:40:04

标签: c++ visual-c++

我使用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; 

将删除[]改为

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

它有效,但为什么我不能使用delete [] p?删除[] p是否仅删除p [0],删除[] p中的[]意味着什么?

3 个答案:

答案 0 :(得分:9)

delete []仅在new []分配后使用,delete仅在new之后使用。

这就是C ++的工作原理。如果您只想分配3个Rectangle的数组,请使用:

Rectangle *p = new Rectangle[3];

...

delete [] p;

答案 1 :(得分: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.

答案 2 :(得分:-1)

p是一个指针数组,当你只删除[] p时,你只是删除指针数组而不是它们指向的对象。这就是为什么你需要遍历所有数组,删除每个指针中创建的对象。使用二维动态数组时也会发生同样的事情。