Effective C++ Term 17 用智能指针接收 new 出来的指针应放在单独一句

有时候我们会写出这样考虑不够周全的代码

void processWidget(std::tr1::shared_ptr pw, int priority);

实际调用这句时,如果是

processWidget(std::tr1::shared_ptr(new Widget), priority());

会有三个动作发生

  • 调用new
  • 构造shared_ptr
  • 调用priority()

这三个动作的调用顺序是不固定的,如果实际发生的顺序为

  1. 调用new
  2. 调用priority()
  3. 构造shared_ptr

这时如果priority()抛出一个异常,new出来的资源就发生了泄漏,所以最好不要在函数参数中使用std::tr1::shared_ptr(new Widget)这样的写法,而是写成单独的一句

std::tr1::shared_ptr pw(new Widget); 
processWidget(pw, priority());

你可能感兴趣的:(Effective C++ Term 17 用智能指针接收 new 出来的指针应放在单独一句)