读书人

C++基础:剔除指针数组

发布时间: 2012-10-07 17:28:51 作者: rapoo

C++基础:删除指针数组。
现在在删除以下类型的指针数组遇到问题。

假设有三个类:
class Duck;
class SuperDuck1: public Duck;
class SuperDuck2: public Duck;

代码问题如下:

C/C++ code
int * duck[3] = {new Duck(), new SuperDuck1(), new SuperDuck2()};// delete [] duck;    //  出错啦,原因是? 我理解是delete[]会将一段连续的内存删除,所以对这种情况同存溢出。for(int i = 0; i < 3; ++i){ // 这样删除就正常。    delete duck[i];}


这种类型的指针数组,还有没有其它的删除方法呢?



[解决办法]
删除完duck[i],再删除duck,没有其它的删除方法。
[解决办法]
duck本身是数组,不是用new申请的空间,因此不能delete
duck内部存放着三个使用new申请的空间的指针,这三个指针可以delete


[解决办法]
a* tmp = new a[10];
delete[] tmp;
new 出来的数组可以这样销毁

楼主是栈变量不用delete。


[解决办法]
这样是否可以,请大师指教
[code=C/C++][/code]

int** duck = new (int*) [3];
int * duck[3] = {new Duck(), new SuperDuck1(), new SuperDuck2()};

for(int i = 0; i < 3; ++i){//是先删除duck[i]吗
delete duck[i];
}

delete [] duck;
[解决办法]
两个层面,
1.指针数组的元素--duck[i]的对象都是一个一个new来的,那么就一个一个的delete
2.指针数组----不是new来的,不用delete

若是指向三个指针元素的指针是new来的,就再delete它

[解决办法]
C/C++ code
Duck*  duck[3] = {new Duck(), new SuperDuck1(), new SuperDuck2()};//int * duck[3] = {new Duck(), new SuperDuck1(), new SuperDuck2()};//duck本身不是在堆上分配的,不等delete// delete [] duck;    for(int i = 0; i < 3; ++i){ // 这样删除就正常。    delete duck[i];}
[解决办法]
可以
C/C++ code
Duck** duck  = new  (Duck*)[3];duck[0] = new Duck();duck[1] = new SuperDuck1();duck[2] new SuperDuck2();for(int i = 0; i < 3; ++i){//是先删除duck[i]吗  delete duck[i];}delete[] duck; 

读书人网 >C++

热点推荐