« C++ 中的接口继承与实现继承 | 返回首页 | 为什么一定要有密码? »

在 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

之前学得都是C++,即将毕业的这段日子,天天翻云风的博客,回想C++的各种艰涩语法,渐渐的也说服自己该把重心作作调整了。虽然小了几岁,但和云风也算是同一辈的人了,偶像的力量将永远激励自己刻苦学习,踏实做事,诚信做人。

我在写游戏时,根据自己的经验就是起初在构造函数里写点数据初始化,后来,就写个空函数放那里,再后来那个空函数都去掉,因为我发现那个空的构造函数都可能在退出程序时崩溃.
云风退出C++用稍微有点极端,其实很多用C++的都悟出解决方法了,像用C一样用C++.
再提一点,我连指针现在都尽量不用,除非是很大的对象要在运行时删除,减少内存,不然一律直接申明.
C++里的一些复杂语法简直是那些天天研究语法硬憋出来的,我极其鄙视模板,除了增加语法复杂度,极其难调试,模板根本就是废物.
还有现在在设计架构时,考虑的面向数据,面向对象是伪命题我同意这个说法.
对于公司来说,松耦合,绝对的模块化是必须的,C++那些语法都是越搞越强的耦合.

为什么不用set_new_handler处理new失败呢

问个问题啊? 云风大哥写的gc垃圾回收的时候是不是要阻塞所有线程啊?

如果愿意,还是可以给我投简历的

两段式在嵌入式里用的比较多……是一种比较安全的考虑……
symbian系统就采取了这样的做法

我的理解:
1. 在C++中,如果new失败则会抛bad_alloc异常.当然也可以像楼上所说,要求失败返回NULL
2. 在构造函数中抛异常并不是好的practice,因为这样析构函数就不会运行了。容易资源泄漏。当然,你有GC的话会好一些

@etreeser

如果愿意,还是可以给我投简历的。这次招聘一直到 3 月底。

来晚了:( 云风大大,还收简历吗?

两段式构造,嵌入式开发的标准模式之一。

记得新标准中new应是不返回NULL, 返回NULL这种未定义的规则有可能会带来不可预计的后果...

C风格很NICE啊 一直很认同云风这种不滥用高级特性的思想, 简洁易懂, 代码之美 :)

呵呵,今年网易的校招被问了这个问题

new A的时候可能内存分配失败,比较好奇云风怎么处理这种情况的?

new创建失败可以返回空指针:
new (std::nothrow) A;

Post a comment

非这个主题相关的留言请到:留言本