Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可安全使用向量。向后放置(新的MyPointer);向量内部的故障是否会导致内存泄漏?_C++_C++11_Memory Leaks_Stdvector - Fatal编程技术网

C++ 可安全使用向量。向后放置(新的MyPointer);向量内部的故障是否会导致内存泄漏?

C++ 可安全使用向量。向后放置(新的MyPointer);向量内部的故障是否会导致内存泄漏?,c++,c++11,memory-leaks,stdvector,C++,C++11,Memory Leaks,Stdvector,使用安全吗 vector.emplace_back( new MyPointer() ); 或者抛出异常或向量内部的某些故障是否会导致内存泄漏 最好执行以下某种形式的操作,首先将指针放在临时唯一的\u ptr中 vector.emplace_back( std::unique_ptr<MyPointer>( new MyPointer() ) ); vector.emplace_back(std::unique_ptr(new MyPointer()); 因此,如果出现向量故障

使用安全吗

vector.emplace_back( new MyPointer() );
或者抛出异常或向量内部的某些故障是否会导致内存泄漏

最好执行以下某种形式的操作,首先将指针放在临时唯一的\u ptr中

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

因此,如果出现向量故障,临时唯一\u ptr仍将清理内存?

它不安全,如果使用第一个版本,将导致内存泄漏。说明如果抛出异常,则对
emplace
的调用无效-这意味着您传入的普通指针永远不会被删除

你可以用

vector.emplace_back( std::unique_ptr<MyPointer>( new MyPointer() ) );
vector.emplace_back( std::make_unique<MyPointer>() );
vector.emplace_back(std::unique_ptr(new MyPointer());
或者使用C++14,您可以使用

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

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

不,第一种情况不安全,如果
向量引发异常,将泄漏内存

第二个场景将不会编译,因为无法将
std::unique\u ptr
隐式转换为
T*
。即使可以,这种情况也可能比第一种情况更糟,因为它将添加指向向量的指针,然后立即删除指向的对象。您将看到一个包含悬空指针的向量

在不更改
std::vector
(我假设是
std::vector
)的类型的情况下,有两种方法可以使此代码异常安全

使用C++11:

auto ptr = std::unique_ptr<MyPointer>(new MyPointer());
vector.emplace_back(ptr.get());
ptr.release();
如果您能够更改
std::vector
的类型,则最简单的方法是上面Daniel Frey建议的方法:

std::vector<std::unique_ptr<MyPointer>> vector;
vector.emplace_back(std::unique_ptr<MyPointer>(new MyPointer()));
std::vector;
vector.emplace_back(std::unique_ptr(new MyPointer());
或使用C++14:

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

我建议
std::make_unique
一旦提供了一些C++14支持,或者如果没有,您自己的支持。您还需要使用上述更改
向量的类型。如果不可行,您可以将添加的元素存储在智能指针外部,添加它,然后检测它是否有效。您是指“C++11”而不是“C++14”?@fnc12不,我是指C++14。在C++11中不可用/标准化。我不知道。谢谢