[英]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.