process(shared_ptr<Widget>(new Widget),priority());
上述代码中,虽然我们使用了智能指针来管理new Widget分配回来的资源,但是上述调用方式依然存在资源泄露的问题。
这是因为C++编译器可能以不同的操作序列来完成这件事。可能的序列如下:
1.执行new Widget
2.调用priority
3.调用shared_ptr的构造函数
如果priority的调用导致异常,会发生什么事?在此情况下,new Widget返回的指针将会遗失,因为它尚未置入sharted_ptr中,后者是我们用来防卫资源泄露的武器。
为了避免这个问题,使用简单的分离语句,即
shared_ptr<Widget> pw(new Widget); process(pw, priority());
这样,由于编译器对于跨越语句的各项操作没有重新排列的自由,只有在语句之内才拥有那个自由度,所以上述方法行得通。