web-dev-qa-db-ja.com

コンテナーでスマートポインターを使用する理由

簡単に言えば、「スマートポインターを使用する理由は何ですか?」 ex std::unique_ptr

しかし、私はスマートポインター通常の(ダム)ポインターを使用する理由を求めていません。すべての人がそれを知っているか、簡単な検索で理由を見つけることができると思います。

私が求めているのは、これら2つのケースの比較です。

MyObjectという名前のクラス(または構造体)があるとします

  1. std:queue<std::unique_ptr<MyObject>>queue;

のではなく

  1. std:queue<MyObject> queue;

(それは必ずしもキューではなく、任意のコンテナにすることができます)

なぜ2ではなくオプション1を使用する必要があるのですか?

4
KansaiRobot

使用例:定数のインデックスを使用してstd::vectorに何かを格納すると同時に、そのベクターからオブジェクトを削除できるようにします。

ポインタを使用する場合は、ポイントされたオブジェクトを削除してvector[i] = nullptrを設定できます(後で確認することもできます)。これは、オブジェクト自体を格納する場合には実行できません。オブジェクトを格納する場合は、インスタンスをベクター内に保持し、フラグbool validまたは何かを使用する必要があります。これは、ベクターからオブジェクトを削除する場合、そのオブジェクトのインデックスが-1変更された後のすべてのインデックスです。


注:この回答のコメントで述べたように、C++ 17以降にアクセスできる場合は、std::optionalを使用して同じことをアーカイブできます。

0
nada