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 中的含义是什么?

4

3 回答 3

9

delete []只能在用 分配后使用new [],并且delete只能在new.

这就是 C++ 的工作原理。如果你想简单地分配一个 3 的数组Rectangle,使用这个:

Rectangle *p = new Rectangle[3];

...

delete [] p;
于 2013-06-20T14:40:58.373 回答
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.
于 2013-06-20T14:41:33.267 回答
-1

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

于 2013-06-20T14:48:54.427 回答