免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1730 | 回复: 5
打印 上一主题 下一主题

[C++] 可否对POD类型显式调用析构函数? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-23 16:28 |只看该作者 |倒序浏览
本帖最后由 Frahm 于 2013-01-23 16:29 编辑

比如一个struct Foo { int bar; }; Foo f; f.~Foo(); 这样是否可行?我在vs上试过,貌似没有被析构,关键我想知道,如此显式调用有没有side effect?

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
2 [报告]
发表于 2013-01-23 16:33 |只看该作者
Frahm 发表于 2013-01-23 16:28
比如一个struct Foo { int bar; }; Foo f; f.~Foo(); 这样是否可行?我在vs上试过,貌似没有被析构,关键我 ...


你认为怎么样才算是被“析构”呢?

论坛徽章:
0
3 [报告]
发表于 2013-01-23 16:35 |只看该作者
本帖最后由 Frahm 于 2013-01-23 16:36 编辑
windoze 发表于 2013-01-23 16:33
你认为怎么样才算是被“析构”呢?

我认为的,被析构后,不能再对实例的对象赋值,访问,经vs下测试,用delete后,访问f.bar会报错,用f.~Foo(), 后可以更改并打印出f.bar,无异常反应

论坛徽章:
0
4 [报告]
发表于 2013-01-23 16:40 |只看该作者
我错了, 原来是因为内存没被回收,
struct Foo {
Foo(){}
virtual ~Foo(){}
int bar;
};
Foo f; f.~Foo();
f.bar = 12;
std::cout << f.bar;
这个一样的

论坛徽章:
0
5 [报告]
发表于 2013-01-23 17:02 |只看该作者
记得除了placement new出来的对象可以显式手动调用析构函数,其它情况手动调用析构函数都是未定义行为吧~~
具体lz可以翻一下c++的标准文档,类似的问题标准文档才是权威可靠的依据,编译器的结果不是可靠甚至是有误导性的。

论坛徽章:
0
6 [报告]
发表于 2013-01-23 17:05 |只看该作者
呆v呆 发表于 2013-01-23 17:02
记得除了placement new出来的对象可以显式手动调用析构函数,其它情况手动调用析构函数都是未定义行为吧~~
...

是的,我正打算写个Allocator,所以才考虑到这个问题,看来POD的struct/class 可以做统一处理,那就方便多了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP