Boost的
为什么没有相应于
以下是来自
make_shared()
函数承诺在尝试创建 shared_ptr
时具有异常安全性。为什么没有相应于
make_shared()
的 make_scoped()
等价物? 是否存在常见的最佳实践?以下是来自
boost::scoped_ptr
文档的代码示例,它似乎不安全: 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());
。解决这个问题的编程实践是:总是将智能指针命名为变量或成员,不要将它们构造为临时子表达式。 - aschepler