繁体   English   中英

std :: vector <> :: emplace_back()中的异常安全吗?

[英]Exception in std::vector<>::emplace_back() safe?

std::vector<>::emplace_back()引发异常时会发生什么?

例如:

class Foo {
public:
  Foo(int bar) {
    if (bar == 4) throw std::exception("Something went wrong");
  }
}

std::vector<std::unique_ptr<Foo>> foo_list;
foo_list.emplace_back(new Foo(3));
try {
  foo_list.emplace_back(new Foo(4));
} catch (std::exception error) {
  // How bad is it?
}
// Whats inside foo_list now?

我希望向量仅包含第一个Foo对象。

是这样吗 这是标准所保证的吗?

而且:会不会有内存泄漏?

我希望向量仅包含第一个Foo对象。

是这样吗 这是标准所保证的吗?

是。 上面的注释已经说明了emplace_back甚至都不会被调用,因为Foo构造函数在初始化函数的参数时会抛出该异常。

但是...

而且:会不会有内存泄漏?

是的,您使用的是我在使用emplace_back(new X)插入智能指针容器中描述的反模式(也已在Overload Journal# 134- 2016年8月发布 )中描述。

emplace_back需要重新分配向量并且由于内存不足而失败时, emplace_back发生问题。 传递给函数的指针将丢失,因此您泄漏了Foo对象。 第一次插入可能会发生这种情况( Foo构造函数不会抛出该Foo ):

foo_list.emplace_back(new Foo(3));

切勿使用emplace_back将原始指针插入unique_ptr容器中,而应使用make_unique

foo_list.emplace_back(std::make_unique<Foo>(3));

或者,如果您必须使用C ++ 11,则构造unique_ptr并将其插入或放置,而不是原始指针:

foo_list.emplace_back(std::unique_ptr<Foo>(new Foo(3)));

这样,该对象将立即由unique_ptr拥有,因此,如果emplace_back内部发生异常, emplace_back该对象将被正确销毁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM