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

1. 有些智能指针类(比如shared_ptr<T>)不支持隐式类型转换,假设存在这样两个函数:

void fun(shared_ptr<int> lhs,int rhs);
int foo();
View Code

那么对于以下函数调用:

fun(new int,foo());

将不能通过编译,解决方法之一:

fun(shared_ptr<int>(new int),foo());

它共有三个步骤:执行new int;构造shared_ptr<int>,调用foo(),但是由于编译器对于同一语句的各项操作具有重新排列的自由,因此除了执行new int肯定在构造shared_ptr<int>之前外,调用foo(),可以发生在任何阶段,可能在最前,中间,最后,如果是按:执行new int→调用foo()→构造shared_ptr<int>的顺序执行,那么如果foo()发生异常,就会在shared_ptr<int>构造之前造成内存泄露.

2. 对于1出现的问题,可以利用编译器对于"跨越语句的各项操作"没有重新排列的权力,以独立语句将newed对象置入智能指针,如下:

shared_ptr<int> ptr(new int);
fun(ptr,foo);
View Code

这样可以防止由于foo在new出的int被放入shared_ptr<int>之前抛出异常而导致内存泄露,但要注意:

ptr不是临时对象,也就是说调用fun后ptr管理的内存没有被释放,而ptr的存在并不是为了要访问底层资源,而是为了防止出现异常而造成内存泄露存在的,所以如果不需要ptr所指向的内存,最好调用reset()将它释放.(个人认为这个条款有些鸡肋)

原文地址:https://www.cnblogs.com/reasno/p/4752523.html