使用delete []p;时导致堆损坏



如果我使用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中意味着什么?

delete []只能在new []分配后使用,delete只能在new分配后使用。

这就是c++的工作原理。如果您想简单地分配一个包含3个Rectangle的数组,请使用以下命令:

Rectangle *p = new Rectangle[3];
...
delete [] p;

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.

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

最新更新