这是《Effective C++》中第17个原则,作者以一个示例形象地说明了这一点。
有一个资源处理函数A,这个函数中接收两个参数,它们分别是shared_ptr类型的指针和一个整形参数。但是,因为用对象来管理资源的原则,所以在这里首先有了一个资源管理类的对象,并且想把它作为A的第一个参数传进去,而A的第二个参数用一个能返回整形参数的成员函数B作为实参传进来。程序员为了图省事,他直接在A的第一个参数的位置上new了一个对象C,这个对象当然就是资源管理类的类型了,但是A接受的是智能指针类型,所以他还在此基础上进行强制类型转换到智能指针类型。
这里还要介绍一个机制,那就是编译器在产生函数调用码之前,首先要对实参进行核算。那么在核算期间,上述内容就可以分成3步:1、new 对象C;2、调用B;3、强制把C转换成shared_ptr类型。
在上述三个步骤中,1和3的顺序是确定的,那就是1在先3在后。但是2却不一定了,这是根据语言和编译器的不同而异的,所以它们的顺序可能是213、123、132。但是在123的情况下,如果调用B的过程发生了异常,导致程序终止,而new C返回的指针会丢失。又因为shared_ptr是用来防止资源泄露的,那么我们的目的没有达到,new出来的C还是泄露了。
所以作者在此原则中想着重强调的是,你最好不要在调用函数的过程中直接在参数列表里面进行new啊,类型转换之类的操作,一旦发生资源泄露难以察觉,所以你最好把这些都放在函数调用之前的单独语句里面。
原则17:以独立语句将newed对象置入智能指针
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...