1

そのため、これを処理するための最良のスマートポインターがあるかどうかを判断しようとして、かなりのグーグル検索を行いましたが、良い選択に落ち着くことができませんでした.

struct Car
{
    int m_doors;
    int m_headlights;
    //etc..
}

私はいくつかのクラス Car を持っているとしましょう。ジャンクヤードも持ってstd::map<int carkey, Car*>います。

Car* は、一部の Driver によって JunkYard に追加される可能性があります。Driver 自身が Car を新規作成しますが、Driver は Car* のすべての責任を即座に失います。

私はジャンクヤードがすべての車に責任を持つことを望みます.

1 日の終わりに、JunkYard はすべての Car を破壊し、シャットダウンします。

--

A) これがマルチスレッド アプリで、ドライバーが同時に車にアクセスでき、JunkYard が車を破壊できる場合、おそらく shared_ptr が最適ではないかと考えていました。これはやり過ぎですか?他のスレッドが車にアクセスすることはできますが、その車を長期間所有することはなく、常に JunkYard に属している必要があります。

B) これがシングル スレッドの場合、最良の選択は何か - まだ map< some_smart_car_ptr> であると仮定します。車自体を削除するコンテナを車に乗せたいと思います。たとえば、 map.erase(...) を呼び出すと、ポインターがマップから削除されるだけでなく、ポインターも削除されます。

4

1 に答える 1

1

スマート ポインターは間違いなく優先されます。拡張性に優れたヘッダーのみのソリューションについては、boost::shared_ptr を参照してください (TR1 & C++11 / C++0x にあります)。

boost::unordered_map<int carKey, boost::shared_ptr<Car *> > myCollection;

次に、データを参照して参照カウントをインクリメントするたびに、新しい shared_ptr をインスタンス化します。それだけで、時期尚早の削除を防ぐことができます。スコープ付きミューテックス内でポインターの取得とコレクションのルックアップをロックしていることを確認してください。そのような方法:

boost::shared_ptr<Car *> CarManager::get(int carKey) {
    boost::mutex::scoped_lock lock(mutex);

    // ... etc ... //
}
于 2012-04-01T23:26:29.160 に答える