生ポインタを格納するときにstd::vector
が例外セーフではなく、その代わりにunique_ptr
またはshared_ptr
を使用する必要があると数回言われました。std :: vectorは例外セーフではありませんか?
私の質問は、std::vector
は例外ではないのはなぜですか?これらのクラスはどのように問題を解決しますか?
生ポインタを格納するときにstd::vector
が例外セーフではなく、その代わりにunique_ptr
またはshared_ptr
を使用する必要があると数回言われました。std :: vectorは例外セーフではありませんか?
私の質問は、std::vector
は例外ではないのはなぜですか?これらのクラスはどのように問題を解決しますか?
それは、それはメモリ管理のための生のポインタを使用しています例外安全ではないのですstd::vector
ではありません:
int main()
{
try
{
int* i = new int;
throw "oops, memory leak!";
}
catch (...){}
}
、それは、これを行うことは、まったく同じ問題であるだけということです
int main()
{
try
{
std::vector<int*> vi;
vi.push_back(new int);
throw "oops, memory leak!";
}
catch (...){}
}
これらの両方 を使用してスマートポインタで固定されています
int main()
{
try
{
std::unique_ptr<int> i(new int);
std::vector<std::unique_ptr<int>> vi;
vi.push_back(std::unique_ptr<int>(new int));
vi.push_back(std::move(i));
throw "vector destroys unique_ptr's...which delete their memory";
}
catch (...){}
}
(またはshared_ptr
、これはより高価です。 Boostのポインタコンテナを使用することもできます。)
おそらくそうです。いいですよ。 –
「例外ではない」とは、例外の発生時にベクトルが解除されるとメモリリークが発生することを意味します。
Shared_ptrは、ベクトル自体が破棄されたときにポインタによって指されたオブジェクトが削除されることを確認します。
もう1つの方法はBoost pointer containersです。
標準コレクションクラスでは 'std :: auto_ptr <>'を使用しません。 'std :: unique_ptr <>'と 'std :: shared_ptr <>'は安全ですが、C++ 03標準ライブラリにはスマートポインタはありません。 – ildjarn
例外の安全性は、ベクトルの格納内容に依存しません。 – Jon
@ildjarn私はそれは私が言いたいことだと思う、私は二重チェックすることはできませんので、私は言及を見た場所を見つけるように見えることができません。とにかく質問を編集しました。 – SirGuy