20

std::queueスレッドセーフなキューを作成するために、テンプレート化されたクラスとしてラップされた があります。このクラスには 2 つのバージョンがあります。1 つは値型を格納するバージョン、もう 1 つはポインター型を格納するバージョンです。

ポインター型の場合、破棄時にキューの要素を削除するのに問題があります。その理由は、アイテムをキューから安全に削除する方法がわからないためです。

この参照は、キューから要素を削除する唯一の方法はpop(). 参照にはpop()、アイテムのデストラクタを呼び出すとも書かれています。

これは、実際に集計を指している場合と指していない場合があるため、ポインター型で問題を引き起こします。それらのいずれかが集約を指している場合、それらはすべてそうしますが、ラッパーがテンプレート化されているため、どのタイプ (集約または非集約) を扱っているかは保証されません。

では、pop()デストラクタを呼び出すとどうなるでしょうか。すべてが削除され、メモリの割り当てが適切に解除されていることを確認するにはどうすればよいですか?

最後に、私の解決策は、ARM9 用の古いバージョンの GCC を使用しています。私はこれを制御できません。ここで役立つスマート ポインターとコンテナーを備えたライブラリがあることは理解していますが、私には立ち入り禁止です。

4

3 に答える 3

22

オンライン ソースは、支払うだけの価値があります。Josuttis の本のような適切なリファレンスを入手してください。pop() は「デストラクタを呼び出す」のではなく、 pop_front() を呼び出すことによって、キュー アダプタの基になる表現 (デフォルトでは std::deque) から要素を削除するだけです。ポップされるものにデストラクタがある場合、ポップされたオブジェクトが範囲外になったときに使用されますが、キュー クラスはそれとは関係ありません。

于 2010-01-04T21:24:44.517 に答える