标签: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