如果我使用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时,您只删除了指针数组,而不是它们所指向的对象。这就是为什么你需要遍历整个数组,来删除在每个指针中创建的对象。在使用二维动态数组时也会发生同样的事情。