Effective C++ 017以独立语句将newed对象置入智能指针

这一节也比较简单,先假设我们有如下的函数:

int foo();
void memFoo(shared_ptr<T> pw, int foo);

现在假设我们要调用memFoo函数:

memFoo(new W, foo());

但是这样写编译是通不过的,我们可以改造为:

memFoo(shared_ptr<p>(new W), foo());

这样编译就没有问题了,但是却可能出现内存泄露问题,为什么呢?

因为编译器在产出一个memFoo调用码之前,必须先核对即将被传递的各个实参,即在调用memFoo()之前,编译器必须做3件事

1.调用foo()函数

2.执行"new W"

3.调用shared_ptr构造函数

问题就出在这三个的调用顺序上,C++并不能保证上面3个步骤总是按照1~3的顺序来完成的。如果出现以下的顺序

1.执行"new W"

2.调用foo()函数

3.调用shared_ptr构造函数

在2的时候,foo如果返回了错误,抛出异常,那么1中申请的内存将无处释放,导致泄露。

要解决这个问题也比较简单,我们可以挨步来进行调用操作。

shared_ptr<p> pw(new  W);     // 用智能指针存储newed对象
memFoo(w, foo());

 

◆总结

1.以独立语句将newed对象存储于智能指针中。如果不这样做,一旦异常被抛出,有可能导致难以觉察的资源泄露。

更多相关文章
  • 1.为什么? 考虑下面的情况:方法声明为void processWidget(shared_ptr<Widget> pw,int priority). 调用方法 processWidget(shared_ptr<Widget> (new Widget), getPriorit ...
  • 以独立语句将newed对象存储于(置入)智能指针内.如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄露.
  • 章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(2)-读书笔记 <Effective C++ ...
  • Tips13:以对象管理资源 一.用对象的特性来管理资源 最常用的资源就是,new出来的内存,即动态分配内存,此外还有数据库连接,网络sockets等等.重要的是,一旦使用完这些资源,必须给系统. 所谓,用对象管理资源,就是利用对象销毁时,自动调用析构函数,在析构函数内释放这些资源,从而在某种程度上
  • 资源:动态分配的内存.文件描写叙述器.相互排斥锁.图形界面中的字型与笔刷.数据库连接以及网络sockets等,不管哪一种资源,重要的是,当你不再使用它时,必须将它还给系统. 条款13:以对象管理资源 当我们向系统申请
  • 1. 让自己习惯C++(Accustoming yourself to C++) 条款01: 视C++ 为一个语言联邦(View C++ as a federation of languages) 条款02: 尽量以const,enum,inline替换#define(Prefer consts,e
  • 这是前段时间看的书,整理到这里吧,以后查看也方便. 这些条款需要反复查看. 条款01:视C++为一个语言联邦 条款02:尽量用const.enum.inline替换#define 条款03:尽可能的使用const 条
  • 章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(2
一周排行
  • hive配置 编辑 $HIVE_HOME/conf/hive-site.xml,增加如下内容: <property> <name>hive.metastore.uris</name> ...
  • 线性分式变换(linear fractional transformation)的名称来源于其定义的形式:(ax+b)/(cx+d),其中分子分母是线性的,然后最外层是一个分式形式,所以叫做这个名字,但是这个名字其实
  • 


    		    使用tornado模板引擎配合yaml構建nginx配置接口 擴展saltstack
    最近同事们在搞一个nginx的配置下发接口,项目用tornado redis yaml来实 ...
  • Problem Description: Suppose you are at a party with n people (labeled from 0 to n - 1) and among them, ther
  • 


    		    RHEL 5服務篇—使用Apache搭建web服務(四)部署AWStats網站分析系統
    在httpd服务器的访问日志文件access_log中,记录了大量的客户机访问信息,通过分 ...
  • [root@lt ~]# service iptables status 防火墙已停 [root@lt ~]# service iptables start [root@lt ~]# service iptables
  • 项目开源地址:https://github.com/tangxuehua/enode 上一篇文章,简单介绍了enode框架中消息队列的设计思路,本文介绍一下enode框架中关系消息的重试机制的设计思路. 对于一个ED
  • 近期,海外投資蘋果公司為iPhone6手機產品提交了進網申請,經電信設備進網檢測機構測試和我部審查,相關產品滿足進網管理要求.根據<電信條例>有關規定,我部依法定程式在法定時限內為蘋果公司申請進網的手機產 ...
  • http://blog.sina.com.cn/s/blog_6b10255301012co6.html   学习了解电信技术知识的一个很好的手段是阅读3GPP的规范.但是3GPP有大量的规范,我们可能经常面对这些规
  • 题意  知道空存钱罐的重量和装满钱的存钱罐的重量及每种币值的重量   求存钱罐里至少有多少钱  裸的完全背包  但是是求最小值  所以初始0要变成初始INF  max也要变成min #include<cstdi ...