C++基础:删除指针数组。

neicole 2012-09-19 07:07:55
现在在删除以下类型的指针数组遇到问题。

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

代码问题如下:

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

// delete [] duck; // 出错啦,原因是? 我理解是delete[]会将一段连续的内存删除,所以对这种情况同存溢出。

for(int i = 0; i < 3; ++i){ // 这样删除就正常。
delete duck[i];
}



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

...全文
2571 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2012-09-19
  • 打赏
  • 举报
回复
可以
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;


[Quote=引用 4 楼 的回复:]
这样是否可以,请大师指教


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];
}
……
[/Quote]
mujiok2003 2012-09-19
  • 打赏
  • 举报
回复

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];
}


franzhong 2012-09-19
  • 打赏
  • 举报
回复
有new就有delete
你的duck不是new出来的
而是内包含的东西是new出来的,所以要delete
neicole 2012-09-19
  • 打赏
  • 举报
回复
谢谢大家,问题想通了~ 又忘了栈~ 看见11楼,发觉将duck申请为指针的指针MS更好~
大大啊 2012-09-19
  • 打赏
  • 举报
回复
是啊 new 出来的就用 delete
叁叁玖玖 2012-09-19
  • 打赏
  • 举报
回复
new 和 delete是要配对使用的,duck 并不是由new分配出来的堆上的空间,不需要delete
duck[i] 才是new出来的,分别delete就可以了
jiandingzhe 2012-09-19
  • 打赏
  • 举报
回复
你的duck[]是栈上或者全局区声明的,删个啥?
cao_julians 2012-09-19
  • 打赏
  • 举报
回复
两个层面,
1.指针数组的元素--duck[i]的对象都是一个一个new来的,那么就一个一个的delete
2.指针数组----不是new来的,不用delete

若是指向三个指针元素的指针是new来的,就再delete它
li89 2012-09-19
  • 打赏
  • 举报
回复
这样是否可以,请大师指教


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;
白首卧松云 2012-09-19
  • 打赏
  • 举报
回复
a* tmp = new a[10];
delete[] tmp;
new 出来的数组可以这样销毁

楼主是栈变量不用delete。

baichi4141 2012-09-19
  • 打赏
  • 举报
回复 2
duck本身是数组,不是用new申请的空间,因此不能delete
duck内部存放着三个使用new申请的空间的指针,这三个指针可以delete

图灵狗 2012-09-19
  • 打赏
  • 举报
回复
删除完duck[i],再删除duck,没有其它的删除方法。
第3章数据结构 3.1 结构体 实例079结构体类型的定义 实例080结构体变量的初始化 实例081如何使用嵌套结构 实例082将结构作为参数传递并返回 实例083共用体数据类型的定义 实例084共用体变量的初始化 实例085如何使用匿名共用体 实例086枚举类型的定义与使用 实例087用new动态创建结构体 实例088使用结构体标识操作员名称密码和级别 实例089创建包括12个月份的枚举类型 实例090带有函数的结构体 3.2 指针、地址与引用 实例091使用指针自增操作输出数组元素 实例092利用指针表达式操作遍历数组 实例093数组地址的表示方法 实例094指针和数组的常用方法 实例095结构指针遍历结构数组 实例096指针作为函数的参数 实例097多维数组的指针参数 实例098指针作为函数的返回值 实例099使用函数指针制作菜单管理器, 实例100使用指针实现数据交换, 实例101使用指针实现整数排序 实例102指向结构体变量的指针 实例103周指针实现逆序存放数组元素值 实例104输出二维数组的有关值 实例105输出二维数组任一行任一列值 实例106使用指针查找数列中的最大值和最小值 实例107用指针数组构造字符串数组 实例108将若干字符串按照字母顺序输出 实例109用指向函数的指针比较大小 实例110用指针函数实现求学生成绩 实例111使用指针的指针输出字符串 实例112实现输入月份号输出该月份英文名 实例113使用指向指针的指针对字符串排序 实例114分解字符串中的单词 3.3 数组 实例115向数组中赋值 实例116遍历数组 实例117求数组中元素的平均和 实例118数组的排序 实例119向数组中插入元素 实例120数组的删除操作 实例121数组冒泡排序法

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧