我使用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;
Run Code Online (Sandbox Code Playgroud)
我将删除[]更改为
for (int i = 0; i<3; i++)
delete p[i];
Run Code Online (Sandbox Code Playgroud)
它有效,但为什么我不能使用delete [] p?删除[] p只删除p [0],删除[] p中的含义是什么?
delete []仅在分配之后使用new [],并且delete仅在之后使用new.
这就是C++的工作原理.如果你想简单地分配一个3的数组Rectangle,请使用:
Rectangle *p = new Rectangle[3];
...
delete [] p;
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)