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
一周排行
  • 如何將 Cortana 與 Windows Phone 8.1 應用集成 ( Voice command
    随着 Windows Phone 8.1 GDR1 + Cortana 中文版的发布,相信
  • 


    		    Win7下搭建安卓android開發環境
    一.假设你现在什么都没有,那么你需要下载以下的东西: 1.JDK(JavaDevelopm
  • BFC——Block Formatting Context (块格式化上下文) 格式化则表明了在这个环境中,元素处于此环境中应当被初始化,即元素在此环境中应当如何布局等.元素如果创建了BFC,那么BFC决定了如何对其
  • 驱动程序的inf中总能看到这样的语句(以ATI显卡驱动为例): "ATI Radeon HD 2600 XT" = ati2mtag_RV630, PCI\VEN_1002&DEV_958 ...
  • Rootkits病毒主要分为两大类: 第一种是进程注入式Rootkits,另一种是驱动级Rootkits.第一种Rootkits技术通常通过释放动态链接库(DLL)文件,并将它们注入到可执行文件及系统服务进程中运行,
  • #include<iostream> #include<stdio.h> #include<math.h> using namespace std; long long gcd(l ...
  • 


    		    Eclipse Template用法探討
    在编码的过程中,对代码重用的追求应该是我们的一个永恒的追求.我们先 从相同或相似的代码里提
  • 参考的 http://hzy3774.iteye.com/blog/1704419   不过只能解压zip文件  最多也就能解压1M多把 ,我1.5M的可以,4M的不行 还有...之前傻逼的把raw和assets文件 ...
  • public List<User> getPageIndex(int pageIndex,int topNum){ String hql = "select top("+topNum+ ...
  • 1 package com.throwsss; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotF