いいえ、最初のシナリオは安全ではなくvector
、例外がスローされた場合にメモリ リークが発生します。
2 番目のシナリオは、 をstd::unique_ptr<T>
暗黙的に に変換できないため、コンパイルされませんT*
。できたとしても、このシナリオは最初のシナリオよりも間違いなく悪いです。これは、ポインタをベクトルに追加してから、指しているオブジェクトをすぐに削除するためです。ダングリング ポインターを含むベクトルが残ります。
あなたのタイプを変更せずにstd::vector
(私はそれが であると仮定しますstd::vector<MyPointer*>
)、このコード例外を安全にする方法が 2 つあります。
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>());