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

Edd*_*223 9 c++ memory-leaks stdvector c++11

使用安全吗?

vector.emplace_back( new MyPointer() );
Run Code Online (Sandbox Code Playgroud)

或者,向量中抛出异常或某些失败会导致内存泄漏吗?

是否更好地执行以下某种形式,首先将指针放在临时的unique_ptr中.

vector.emplace_back( std::unique_ptr<MyPointer>( new MyPointer() ) );
Run Code Online (Sandbox Code Playgroud)

因此,如果发生向量故障,临时unique_ptr仍将清理内存?

Dan*_*rey 13

它是不是安全的,如果你使用的第一个版本将创建一个内存泄漏.该文件说,如果抛出一个异常,则调用emplace没有任何影响-这意味着你永远不会删除通过普通指针.

您可以使用

vector.emplace_back( std::unique_ptr<MyPointer>( new MyPointer() ) );
Run Code Online (Sandbox Code Playgroud)

或者使用C++ 14

vector.emplace_back( std::make_unique<MyPointer>() );
Run Code Online (Sandbox Code Playgroud)

或者,如果C++ 14还没有,只需滚动你自己的版本make_unique.你可以在这里找到它.

  • 你还需要用上面的方法改变`vector`的类型.如果这是不可行的,您可以将添加的元素存储在智能指针外部,添加它,然后检测它是否有效. (3认同)
  • @ fnc12不,我的意思是C++ 14.[`std :: make_unique`](http://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique)在C++ 11中不可用/标准化. (2认同)