以独立语句将new对象置入只能指针

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());

这样,由于编译器对于跨越语句的各项操作没有重新排列的自由,只有在语句之内才拥有那个自由度,所以上述方法行得通。

猜你喜欢

转载自www.cnblogs.com/cs0915/p/12888034.html