2012-04-10 21 views
1

生ポインタを格納するときにstd::vectorが例外セーフではなく、その代わりにunique_ptrまたはshared_ptrを使用する必要があると数回言われました。std :: vectorは例外セーフではありませんか?

私の質問は、std::vectorは例外ではないのはなぜですか?これらのクラスはどのように問題を解決しますか?

+5

標準コレクションクラスでは 'std :: auto_ptr <>'を使用しません。 'std :: unique_ptr <>'と 'std :: shared_ptr <>'は安全ですが、C++ 03標準ライブラリにはスマートポインタはありません。 – ildjarn

+0

例外の安全性は、ベクトルの格納内容に依存しません。 – Jon

+0

@ildjarn私はそれは私が言いたいことだと思う、私は二重チェックすることはできませんので、私は言及を見た場所を見つけるように見えることができません。とにかく質問を編集しました。 – SirGuy

答えて

5

それは、それはメモリ管理のための生のポインタを使用しています例外安全ではないのです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のポインタコンテナを使用することもできます。)

+0

おそらくそうです。いいですよ。 –

2

「例外ではない」とは、例外の発生時にベクトルが解除されるとメモリリークが発生することを意味します。

Shared_ptrは、ベクトル自体が破棄されたときにポインタによって指されたオブジェクトが削除されることを確認します。

もう1つの方法はBoost pointer containersです。

関連する問題