Effective C++ Term 17 用智能指针接收 ne
2019-05-17 本文已影响0人
vancymoon
有时候我们会写出这样考虑不够周全的代码
void processWidget(std::tr1::shared_ptr<Widget> pw, int priority);
实际调用这句时,如果是
processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority());
会有三个动作发生
- 调用
new
- 构造
shared_ptr
- 调用
priority()
这三个动作的调用顺序是不固定的,如果实际发生的顺序为
- 调用
new
- 调用
priority()
- 构造
shared_ptr
这时如果priority()
抛出一个异常,new
出来的资源就发生了泄漏,所以最好不要在函数参数中使用std::tr1::shared_ptr<Widget>(new Widget)
这样的写法,而是写成单独的一句
std::tr1::shared_ptr<Widget> pw(new Widget);
processWidget(pw, priority());