【发布时间】:2012-07-05 02:46:45
【问题描述】:
Boost 的 make_shared() 函数承诺在尝试创建 shared_ptr 时是异常安全的。
为什么没有make_scoped() 等价物?是否有通用的最佳做法?
这是来自boost::scoped_ptr documentation 的代码示例,对我来说似乎不安全:
boost::scoped_ptr<Shoe> x(new Shoe);
这行代码会依次完成这三件事:
- 为
Shoe分配堆内存 - 调用
Shoe的构造函数 - 调用
boost::scoped_ptr<Shoe>的构造函数
如果Shoe 的构造函数抛出异常,内存将被泄露。 (参见 R. Martinho Fernandes 的回答)scoped_ptr 不会处理释放,因为它还没有被构造。
这是疏忽吗?或者有没有我没注意到的解决方案?
【问题讨论】:
-
这个例子是安全的,但不是:
f(boost::scoped_ptr<Shoe>(new Shoe), g());。解决问题的编码实践:始终将智能指针命名为变量或成员,不要将它们构造为临时子表达式。
标签: c++ boost make-shared scoped-ptr