首页 > 代码库 > effective C++ 读书笔记 条款17 以独立语句讲newed对象置入智能指针

effective C++ 读书笔记 条款17 以独立语句讲newed对象置入智能指针

// Test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <memory> //注意加这个头文件using namespace std;class Widdget{};int priority(){	return 0;}/*下面的函数可能造成内存泄露:调用的时候如下:processWiddget(std::tr1::shared_ptr<Widdget>(new Widdget), priority());这里的 std::tr1::shared_ptr<Widdget>(new Widdget)由两部分组成1:执行new Widdget表达式2:调用tr1::shared_ptr构造函数再加上priority()函数,在调用processWiddget()之前,编译器必须创建代码,做一下三件事情:调用priority()函数执行“new Widdget”调用tr1::shared_ptr构造函数C++编译器对这三个调用顺序不是固定的,可以确定的是new Widdget一定执行于tr1::shared_ptr构造函数之前,因为new Widdget的结果要作为构造函数的一个参数,但是对于priority的调用排在哪个顺序就不知道了 可能是:1:new Widdget2:调用priority()3:调用tr1::shared_ptr构造函数这里如果priority调用出现了异常没那么new Widdget的指针将会遗失掉, 造成资源泄露。解决办法很简单:使用分离语句:(1):创建Widdget(2):讲它置入一个智能指针内,然后再调用processWiddgetstd::tr1::shared_ptr<Widdget> pw(new Widdget);//单独语句内以智能指针存储newed所得对象processWiddget(pw,priority())以独立语句将newed对象存储于智能指针,如果不这样做,一旦发生异常可能导致内存泄露在VC6.0中不能使用tr1::shared_ptr*/void processWiddget(std::tr1::shared_ptr<Widdget> pw, int priority()){	}int _tmain(int argc, _TCHAR* argv[]){	return 0;}

effective C++ 读书笔记 条款17 以独立语句讲newed对象置入智能指针