免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: happyness
打印 上一主题 下一主题

delete一个对象数组的问题,请大侠帮忙看看 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-01-30 14:02 |只看该作者
所谓c++的切片问题就是这种情况,可以作为一个经典案例.java就没有这个问题.解决办法就是把base扩展为和derived一样的属性和方法,不需要的方法改为virtual

论坛徽章:
0
12 [报告]
发表于 2007-01-30 19:00 |只看该作者

如果上面的有问题,就是编译器的错误了。

上面的例子很好,这就是为什么我们需要将析构函数定义为虚函数的原因。

楼主的例子很好,如果有错,就是编译器的问题了。

实际上,delete[] p和delete p 的区别仅仅是调用析构函数的次数不一样,
像你的例子中,两者效果是一样的。

如果类中有资源需要释放,就必须用delete[] ,以便多次(2次)调用析构函数。

delete p总能把对象本身的内存释放掉,因为分配时有记录。

论坛徽章:
0
13 [报告]
发表于 2007-01-30 20:58 |只看该作者
呵呵,这个是因为在做数组析构的时候,编译器会对每个元素都做一次析构,由于代码中写的是基类的指针,因此,编译器在计算每个元素的偏移的时候,是按照基类的大小来计算的。因此,第一个元素的析构函数可以被正常调用,而第二个是不可以的,因为此时已经指向了错误的内存区域。如果基类大小和子类大小是一样的,那么这段代码就不会core掉。

总之,不要将动态的特性施行于数组之上。

论坛徽章:
0
14 [报告]
发表于 2007-03-14 09:53 |只看该作者
理解了more effective c++中说的就不会这样写代码了

论坛徽章:
0
15 [报告]
发表于 2009-08-29 15:39 |只看该作者
原帖由 清汤挂面 于 2007-1-30 20:58 发表
呵呵,这个是因为在做数组析构的时候,编译器会对每个元素都做一次析构,由于代码中写的是基类的指针,因此,编译器在计算每个元素的偏移的时候,是按照基类的大小来计算的。因此,第一个元素的析构函数可以被正 ...


解释得非常好!

论坛徽章:
0
16 [报告]
发表于 2011-12-31 14:33 |只看该作者
可以这样删除:
delete[] (Derived*)p;

改造两个析构函数
  1. virtual ~Base () {std::cout<<"~Base ()"<<std::endl;}

  2. virtual ~Derived () {std::cout<<"~Derived ()"<<std::endl;}
复制代码
输出结果如下:
  1. ~Derived ()
  2. ~Base ()
  3. ~Derived ()
  4. ~Base ()
复制代码

论坛徽章:
0
17 [报告]
发表于 2012-08-20 09:33 |只看该作者
哎呦,我也用到了对象数组的问题,但是使用继承类的不多,不过这个隐含问题不简单啊

论坛徽章:
0
18 [报告]
发表于 2013-03-12 23:46 来自手机 |只看该作者
厉害,在此受教了^_^

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
19 [报告]
发表于 2013-03-13 09:25 |只看该作者
就应该废掉C++这种语言

开发者应该专注于算法、结构、实现

而想成为C++的高手,首要任务竟然是让自己了解C++的数不清的坑,这通常要耗费大量时间

个人观点,不喜勿喷,懒得争吵

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
20 [报告]
发表于 2013-03-13 11:25 |只看该作者
回复 15# xinxin12375


are you sure?

那只是对一种编译器行为的解释,语言规范中说通过一个基类指针来删除一个含有派生类对象的数组,结果将是不确定的,
我用VC就没挂,也就是说编译器厂商的实现是不一样的

所以13楼的回答中最可取的就一句:总之,不要将动态的特性施行于数组之上。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP