繁体   English   中英

安全使用vector.emplace_back(new MyPointer); 向量内部故障会导致内存泄漏吗?

[英]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仍会清理内存吗?

这是不是安全的,如果你使用的第一个版本将创建一个内存泄漏。 文档说,如果引发异常,则对emplace的调用无效-这意味着您传递的普通指针不会被删除。

您可以使用

vector.emplace_back( std::unique_ptr<MyPointer>( new MyPointer() ) );

或与C ++ 14一起使用

vector.emplace_back( std::make_unique<MyPointer>() );

或者,如果C ++ 14尚不可用,只需滚动自己的make_unique版本。 你可以在这里找到它。

不,第一种情况是不安全的,如果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.

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