1

実行中に特定の種類のオブジェクト(たとえば、「Foo」クラス)を作成して、いくつかの統計を追跡し、それらを2つのSTLマップの一方または両方に挿入するアプリケーションがあります。

map<Foo*, int> map1;
map<Foo*, int> map2;

Fooオブジェクトを削除する最良の方法は何だろうと思っていました。現時点での私の解決策は、map1とmap2を繰り返し処理し、Fooポインターをセットに入れてから、このセットを操作して、それぞれでdeleteを呼び出すことです。

auto_ptrを使用するなど、より効果的な方法はありますか?もしそうなら、auto_ptr <>オブジェクトはSTLコンテナに保存できないので?

前もって感謝します。

4

4 に答える 4

10

auto_ptrおっしゃるように、オブジェクトをSTLコンテナに格納することはできません。shared_ptr私はこの目的のために(ブーストからの)オブジェクトを使用するのが好きです。これは参照されたカウントポインタであるため、オブジェクトがスコープ外になると、オブジェクトは1回だけ削除されます。

typedef<shared_ptr<Foo>, int> Map;
Map map1;
Map map2;

map1ここでmap2shared_ptrオブジェクトをポインタとして追加および削除するだけで、最後の参照が削除されたときにオブジェクトが削除を処理します。

于 2009-09-07T07:50:21.797 に答える
7

boost::shared_ptrを使用します-オブジェクトを複数の場所から参照できる場合を特に対象としています。auto_ptrを使用することは、ここではオプションではありません。オブジェクトへの最初のauto_ptrが破棄されると、2番目のauto_ptrにはダングリングポインターが残り、未定義の動作への直接的な方法になります。

于 2009-09-07T07:48:47.937 に答える
3

マスターリストまたはオブジェクトのセットが必要だと思います。それらをコピーする余裕がある場合は値によって保持されるか、ポインターをコピーして他のコレクションに配置できるようにポインターによって保持される可能性が高くなります。

std::list<Foo*> Master;

これらの他のコレクション(map1およびmap2あなたの例では)は、いつでもこれらのポインターを挿入および削除することができます。最終的にすべてを削除したい場合は、マップを削除するか、スコープ外にするか、無視して、マスターリストに戻って、見つかったポインターの削除を繰り返します。

于 2009-09-07T09:39:10.063 に答える
1

http://ootips.org/yonat/4dev/smart-pointers.htmlは、STLコンテナーに格納できる特定の種類のスマートポインターについて説明しています。こちらをご覧ください

于 2009-09-07T07:51:12.190 に答える