码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-11-20 15:20:24      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:blog   io   ar   os   使用   sp   文件   2014   log   

// 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 Widdget
2:调用priority()
3:调用tr1::shared_ptr构造函数
这里如果priority调用出现了异常没那么new Widdget的指针将会遗失掉, 造成资源泄露。


解决办法很简单:
使用分离语句:
(1):创建Widdget
(2):讲它置入一个智能指针内,然后再调用processWiddget
std::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对象置入智能指针

标签:blog   io   ar   os   使用   sp   文件   2014   log   

原文地址:http://blog.csdn.net/djb100316878/article/details/41313369

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!