在 C++ 中引入 gc 后的对象初始化
这几天白天都在安排面试,其实还是有点累的。晚上就随便写点程序,好久没摸 C++ ,有点生疏。也算是娱乐一下吧。
主要工作其实是在 C 库的基础上做一个 C++ 的中间层。跟在 C 库的基础上做 lua 中间层差不太多。前几天加入了 gc 后,发现了一些有趣的用法。
比如对于构造对象。 C 的 api 中,如果创建一个对象失败,就会返回空指针。但是对于 C++ 就不一样了,new 是不应返回空指针的。书本上的推荐做法是在构造函数里抛异常。但是我又不太想进一步的引入异常机智,怎么办呢?
简单的方法是让 C++ 的封装类的构造函数什么都不干。btw, 我听 google 的 Mike Burrows 也讲过 popular C++ constructs can be bad for abstraction 。
然后加一个 init 函数来初始化这个对象,成功则返回 this 指针,失败则返回 NULL。
如果没有 gc 的时候,我需要这样做:
A *a = new A; if (!a->init()) { delete a; a = NULL; }
有了 gc 后很方便,只需要
A *a = (new A)->init();
嘿嘿,有 gc 还是方便很多呀。只是 new 的操作优先级让我有点不爽。
ps. 我知道即使没有 gc ,我也可以用很现代的 template 技术做到同样的事情。而且代码看起来更有品味。不过我感觉自己越来越老土了,写 C++ 也越来越 C Style 了。完全没有 10 多年前对 C++ 的火热激情。
Comments
皇冠平台,时时彩平台,永利高平台,波音平台,金沙平台,皇马平台,广东快乐十分平台,太阳城平台,六仔平台提供全方位博彩类系统出租出售服务!www.pt5555.com 业务联系QQ:878989678
Posted by: 李D少 | (15) July 30, 2012 05:17 PM
之前学得都是C++,即将毕业的这段日子,天天翻云风的博客,回想C++的各种艰涩语法,渐渐的也说服自己该把重心作作调整了。虽然小了几岁,但和云风也算是同一辈的人了,偶像的力量将永远激励自己刻苦学习,踏实做事,诚信做人。
Posted by: kmplayer | (14) December 8, 2010 04:21 PM
我在写游戏时,根据自己的经验就是起初在构造函数里写点数据初始化,后来,就写个空函数放那里,再后来那个空函数都去掉,因为我发现那个空的构造函数都可能在退出程序时崩溃.
云风退出C++用稍微有点极端,其实很多用C++的都悟出解决方法了,像用C一样用C++.
再提一点,我连指针现在都尽量不用,除非是很大的对象要在运行时删除,减少内存,不然一律直接申明.
C++里的一些复杂语法简直是那些天天研究语法硬憋出来的,我极其鄙视模板,除了增加语法复杂度,极其难调试,模板根本就是废物.
还有现在在设计架构时,考虑的面向数据,面向对象是伪命题我同意这个说法.
对于公司来说,松耦合,绝对的模块化是必须的,C++那些语法都是越搞越强的耦合.
Posted by: Imag2 | (13) March 19, 2010 04:46 PM
为什么不用set_new_handler处理new失败呢
Posted by: kayaklee | (12) March 8, 2010 11:42 AM
问个问题啊? 云风大哥写的gc垃圾回收的时候是不是要阻塞所有线程啊?
Posted by: dudu | (11) March 4, 2010 05:47 PM
如果愿意,还是可以给我投简历的
Posted by: 科士威 | (10) March 2, 2010 10:39 PM
两段式在嵌入式里用的比较多……是一种比较安全的考虑……
symbian系统就采取了这样的做法
Posted by: joshua | (9) March 1, 2010 05:02 PM
我的理解:
1. 在C++中,如果new失败则会抛bad_alloc异常.当然也可以像楼上所说,要求失败返回NULL
2. 在构造函数中抛异常并不是好的practice,因为这样析构函数就不会运行了。容易资源泄漏。当然,你有GC的话会好一些
Posted by: Leo Jay | (8) February 26, 2010 05:49 PM
@etreeser
如果愿意,还是可以给我投简历的。这次招聘一直到 3 月底。
Posted by: cloud | (7) February 25, 2010 11:57 PM
来晚了:( 云风大大,还收简历吗?
Posted by: etreeser | (6) February 25, 2010 06:40 PM
两段式构造,嵌入式开发的标准模式之一。
Posted by: jason | (5) February 25, 2010 05:11 PM
记得新标准中new应是不返回NULL, 返回NULL这种未定义的规则有可能会带来不可预计的后果...
C风格很NICE啊 一直很认同云风这种不滥用高级特性的思想, 简洁易懂, 代码之美 :)
Posted by: Anonymous | (4) February 25, 2010 01:38 AM
呵呵,今年网易的校招被问了这个问题
Posted by: 柒笑侠 | (3) February 24, 2010 10:46 PM
new A的时候可能内存分配失败,比较好奇云风怎么处理这种情况的?
Posted by: Anonymous | (2) February 24, 2010 10:34 PM
new创建失败可以返回空指针:
new (std::nothrow) A;
Posted by: cmathser | (1) February 24, 2010 10:20 PM