记住:
以独立语句将 newd 对象存储于智能指针内. 如果不这样做, 一旦异常被抛出, 有可能导致难以察觉的资源泄漏.
- int priority();
- void processWidget(std::tr1::shared_ptr<Widget> pw, int priority);
- // 编译错误, 因为 shared_ptr 的构造函数是个 explicit 构造函数, 无法进行隐式转换
- processWidget(new Widget, priority());
- // 编译正确, 但有潜在问题.
- // 在调用 processWidget 之前, 编译器必须创建代码, 做以下三件事
- // 1. 调用 priority()
- // 2. 执行 new Widget
- // 3. 调用 tr1::shared_ptr 构造函数
- // C++ 编译器完成函数参数的计算顺序是不确定的, 所以如果执行顺序为
- // 1. 执行 new Widget
- // 2. 调用 priority()
- // 3. 调用 tr1::shared_ptr 构造函数
- // 万一 priority() 调用导致异常, new Widget 返回的指针会遗失, 因为它尚未被置入 shared_ptr 内.
- processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority());
- // 解决办法是
- std::tr1::shared_ptr<Widget> pw(new Widget);
- processWidget(pw, priority());
来源: http://www.bubuko.com/infodetail-2655891.html