[英]why does vector.emplace_back call the move-constructor?
[英]Safe to use vector.emplace_back( new MyPointer ); Could failure inside vector lead to leaked memory?
使用安全吗
vector.emplace_back( new MyPointer() );
还是在向量内部引发异常或某些故障会导致内存泄漏?
最好执行以下形式,将指针放在临时的unique_ptr中。
vector.emplace_back( std::unique_ptr<MyPointer>( new MyPointer() ) );
因此,如果发生向量故障,临时的unique_ptr仍会清理内存吗?
不,第一种情况是不安全的,如果vector
抛出异常,则会泄漏内存。
第二种情况将无法编译,因为std::unique_ptr<T>
不能隐式转换为T*
。 即使可以,这种情况也可以说比第一种情况更糟,因为它将向您的向量添加指针,然后立即删除所指向的对象。 您将得到一个包含悬空指针的向量。
在不更改std::vector
的类型(我假设是std::vector<MyPointer*>
)的情况下,有两种方法可以使此代码异常安全。
使用C ++ 11:
auto ptr = std::unique_ptr<MyPointer>(new MyPointer());
vector.emplace_back(ptr.get());
ptr.release();
或更详细的C ++ 03方式:
MyPointer* ptr = new MyPointer();
try
{
vector.push_back(ptr);
}
catch (...)
{
delete ptr;
throw;
}
如果您能够更改std::vector<MyPointer*>
的类型,那么最简单的方法就是上面的Daniel Frey建议的方法:
std::vector<std::unique_ptr<MyPointer>> vector;
vector.emplace_back(std::unique_ptr<MyPointer>(new MyPointer()));
或使用C ++ 14:
std::vector<std::unique_ptr<MyPointer>> vector;
vector.emplace_back(std::make_unique<MyPointer>());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.