author:
- luixiao1223
title: new操作和放入管理器用多行
问题
processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority());
编译器会把上面的语句分成三个步骤
- 调用 priority
- 执行new Widget
- 调用
shared_ptr
构造函数
*但是编译器用什么顺序来执行这三个步骤,弹性很大*
如果像如下的顺序
- 执行new Widget
- 调用 priority
- 调用
shared_ptr
构造函数
异常
如果第二步 priority
发生异常。那么Widget就不会被释放。这就是说可能发生资源泄露
解决方案
把单独的一行分开
std::tr1::shared_ptr<Widget> pw(new Widget);
processWidget(pw, priority());
原因:
- 编译器没有调整不同行之间的顺序。
- 同一行编译器是可以调整调用顺序的。