2013-04-11 11 views
9

クラスのインスタンスのポインタを作成する必要があり、プログラムはコンパイル時に作成するポインタの数を知らない。 削除のために、私はベクトルにポインタを格納し、それを一つずつ削除することを検討していました。 スマートポインタの使用はよりクリーンな方法でしょうか? スマートポインタを使用したくない場合、このベクトルの使用はきれいだと考えられますか?ポインタのベクトルを削除する

最小コード:

#include <vector> 
using namespace std; 

class Foo { 
public: 
    Foo(); 
}; 
Foo::Foo(){} 
void createFooVector(int nb, std::vector<Foo*> &v){ 
    for(int i=0;i<nb;i++){ 
     Foo* f = new Foo(); 
     v.push_back(f); 
    } 
} 
int main(int argc, char *argv[]){ 
    std::vector<Foo*> v; 
    createFooVector(5,v); 
    while (!v.empty()){ 
     Foo* f = v.back(); 
     v.pop_back(); 
     delete f; 
    } 
} 
+2

本当にポインタのコンテナが必要ですか? 'Foo'オブジェクトを値として保存できません(' std :: vector ')?また、 'createFooVector'が引数として与えられたものを変更するのではなく、新しいベクトルを返した場合、それはもっと明確になりませんか? –

+0

@LucTouraille私はこの理由のためにポインタを使用します:http://stackoverflow.com/questions/15471193/vector-of-virtual-class-are-pointers-the-cleanway-to-go ...これはできませんでした私がここに示したコードでは、最小限に抑えようとしました。 – Vince

答えて

3

私は示唆しているいずれかのboost::pointer_vectorstd::vector<std::unique_ptr<Foo>>、またはvector<Foo*>を保持し、コンストラクタで削除の世話をするあなた自身のFooマネージャークラスをロールアウトを使用します(「エキスパート」解決策、そして唯一の試みとしてこれを見るべきですあなたが例外安全性を完全に理解しているならば)。手動で削除を実行したくない場合は、簡単にエラーにつながる可能性があります。

+0

私はマネージャのソリューションを推奨しません。 OPは例外に関して十分に安全ではない可能性があります。 –

+0

@MatthieuM。本当です。私はそれについての警告を追加しました。 – juanchopanza

1

あなたのコードは大丈夫です。しかし、スマートポインタを使用することが望ましい選択肢です(書き込むためのコードが少なく、メモリバグの機会がはるかに少ない)。

1

は、スマートポインタの使用は行くためのクリーンな方法でしょうか?

はい。

スマートポインタを使用したくない場合は、 ベクトルのこの使用はクリーンであると見なされますか?

私はアイデアを持っていない、誰かがそれは宿題ではない場合は、C++でのスマートポインタを使用したくない理由... しかし、私が思うに、それはこの場合にはboost::pointer_containersのようなものを使用することをお勧めします。

1

Fooから派生したクラスを使用しておらず、Fooが構造をコピーするのに比較的安価な場合は、vector<Foo>を使用してください。

コンパイラが移動セマンティクスをサポートしている場合、問題はありません。

+1

問題を構成するのに費用がかかっても、あなたは*コピー*するのに費やすことを考えていたと思います。しかし、移動のセマンティクスでは、それほど大きな問題ではないかもしれません。最悪の場合は、新しい 'emplace_back'メンバを使用できます。 –

+0

@Matthieuはい、移動セマンティクスはすべてを変更します。私が何を意味しているかを明確にするために、値をベクトルにプッシュするには、それを構築してから、ベクトルコピーで別の値を構築しなければなりません。私は、一般的な価値観の構築を考慮する必要性を示すことを意図していました。私は 'copy construct'と言って更新する予定です。 –

関連する問題