C++之以独立语句将newed对象置入智能指针(17)---《Effective C++》
来源:互联网 发布:mysql execute into 编辑:程序博客网 时间:2024/06/06 17:36
条款17:以独立语句将newed对象置入智能指针
利用RAII机制对对象进行指针转换的时候,需要将newed对象以独立语句置入,为什么这样做呢?我们有如下示例:
int hello();void handleA(std::trl::shared_ptr<A> pA,int hello());...handleA(new A,hello());//这样无法通过编译,A的构造函数是显示的,无法进行隐式转换,好吧,既然这样,我们换一种方法;handleA(std::trl::shared_ptr<A>(new A),hello());//这下可以不?当然可以执行呀,但是可能发生资源泄露的问题,下面我们会进行一个详细讲述。
第二个看来“合理”的handleA函数怎样执行呢?hello只是一个简单的函数调用,而第一个实参则有两部分组成:
1)执行“new A”表达式;
2)调用trl::shared_ptr构造函数。
于是在调用handleA函数之前,编译器会创建代码,做以下三种事情:
1)调用priority函数;
2)执行“new A”操作;
3)调用trl::shared_ptr构造函数;
C++的多种编译器可能会有不同的方法执行它们,但能确定的是,new A操作一定发生在trl::shared_ptr执行构造函数之前,可能选择如下方式执行它们:
1)执行“new A”操作; 2)调用priority函数; 3)调用trl::shared_ptr构造函数; 此时,试想一下调用priority函数的时候发生异常,哈哈,这下懵了吧,new A创建的对象将无法使用RAII类完成,造成资源泄露了,没办法,谁让你那样写程序呢,你指望靠运气的话,那真只能靠运气跑程序了!
放心啦,C++坑多,可是大神设计C++时候就给了解决方案了呀!避免这种问题的方法很多票,创建分离语句就可以完成呀!参看如下代码:
std::trl::shared_ptr<A> pA(new A);handleA(pA,hello());
这下不就得到解决啦,无论hello()发不发生异常,资源new A一定可以通过RAII类std::trl::shared_ptr智能指针进行销毁,资源泄露不就得到解决啦!
总结:
以独立语句将newed对象置入智能指针内,如果不这样做,一旦发生异常,可能会发费很久时间进行调试而且找不到bug!良好的设计是避免问题的良药,希望大家在C++大坑中越走越爽哈!
阅读全文
0 0
- C++之以独立语句将newed对象置入智能指针(17)---《Effective C++》
- 《Effective C++》学习笔记条款17 以独立语句将newed对象置入智能指针
- Effective C++(17) 以独立语句将newed对象置入智能指针
- Effective C++——》条款17:以独立语句将newed的对象置入智能指针
- Effective C++:条款17:以独立语句将newed对象置入智能指针
- 读书笔记《Effective C++》条款17:以独立语句将newed对象置入智能指针
- Effective C++ 学记之17 以独立语句将newed对象置入智能指针
- Effective 学习之以独立语句将newed对象置入智能指针
- effective c++ 条款17 :以独立语句将newed 对象置入智能指针
- Effective C++ Item 17 以独立语句将newed对象置入智能指针
- item17: 以独立语句将newed对象置入智能指针
- effective C++ 读书笔记 条款17 以独立语句讲newed对象置入智能指针
- 条款17:以独立语句将newed对象置入智能指针
- 条款17:以独立语句将newed对象置入智能指针
- 条款17:以独立语句将newed对象置入智能指针
- 条款17:以独立语句将NEWED对象置入智能指针
- 条款17:以独立语句将newed的对象置入智能指针
- 条款17:以独立语句将newed对象置入智能指针
- Http协议中访问的状态码
- 第3章 Raster Images
- Oracle 11g RAC搭建(VMware环境)
- 章鱼体验第一天:思杰VDI之7.14.1
- win7下修改php.ini的配置路径
- C++之以独立语句将newed对象置入智能指针(17)---《Effective C++》
- 返回其最后一个单词的长度(容易)
- 初识Kotlin及环境搭建
- Qt学习笔记
- 原生JS对象编写
- 第五篇 :微信公众平台开发实战Java版之如何获取公众号的access_token以及缓存access_token
- 解决图片三像素
- 文章标题
- Exception in thread "main" java.lang.IllegalArgumentException: node to traverse cannot be null!