19

私はスマート ポインター ( ) について学習していますが、スマート ポインター ( ) をコンテナー (つまり ) に入れるべきではないことをここここstd::auto_ptrで読んだだけです。スマート ポインターが内部的に (たとえば、クラスごとに) コピーされず、その所有権を譲渡しないという規則はありません。その後、ポインターは NULL になります。結局、すべてが台無しになります。std::auto_ptrstd::vectorvector

実際、これはどのくらいの頻度で発生しますか?

時々私はポインターのベクトルを持っていますが、将来、スマートポインターのベクトルを持ちたいと決めた場合、私のオプションは何ですか?

私は C++0x と Boost ライブラリを認識していますが、今のところ、STL アプローチに固執したいと思います。

4

5 に答える 5

16

はい、標準のコンテナーでは使用できませんコピーは同等ではありません。また、標準のコンテナー (およびアルゴリズム) は自由に要素をコピーできるため、問題が発生します。つまり、 a をコピーする操作には、オブジェクトの単なるコピー以外の意味があります。これは、所有権の譲渡を意味ますstd::auto_ptrstd::auto_ptrstd::auto_ptr

オプションは次のとおりです。

  1. Boost Smart Pointers ライブラリを使用します。これは間違いなく最良の選択肢です。
  2. プリミティブ ポインターを使用します。ポインタを適切に管理する限り、これは高速で安全です。場合によっては、これが複雑または困難になることがあります。たとえば、二重削除の問題に自分で対処 (回避) する必要があります。
  3. 独自の参照カウント スマート ポインターを使用します。それはばかげているでしょう。ブースト スマート ポインターを使用します。
于 2011-01-02T09:42:25.190 に答える
11

あなたが参照している問題は、コピー時に所有権を移動するため、auto_ptr に関するものです。shared_ptr と unique_ptr はコンテナーで問題なく機能します。

于 2011-01-02T09:38:10.677 に答える
3

標準コンテナー テンプレートで使用する型は、そのコンテナーの要件に準拠する必要があります。特に、型はCopyConstructibleおよびAssignable型の要件を満たさなければなりません。

多くのスマート ポインターはこれらの要件を満たし、標準コンテナーで使用できますがstd::auto_ptr、それらのコピーstd::auto_ptrは作成元または割り当て元のソースと同等ではないため、スマート ポインターの 1 つではありません。

標準コンテナの一部の実装はauto_ptr状況によっては動作する可能性がありますが、そのような実装の詳細に依存するのは危険です。

于 2011-01-02T09:38:38.500 に答える
2

理論的にはstd::auto_ptr、内部実装を完全に理解し、auto_ptr の所有権を失う可能性のあることを何も行わなければ、STL コンテナーで使用できますが、実際には生の ptr でコンテナーを使用する方がはるかに安全です。

「実際、これはどのくらいの頻度で起こりますか?」- それ自体非常に危険な質問です。まず第一に、STL は 1 つの標準実装ではなく、多数あります。それぞれがさまざまな方法でコンテナーを実装できるため、高度に調整されたコードをすべて回避して、すべての「コンテナー内の auto_ptr」鉱山を別の STL 実装に切り替えることができます。また、コードのメンテナンスは非常に複雑になり、コードを正しく変更すると、プログラムが壊れる可能性があります。どうすればそれを覚えたり、他のメンテナーに覚えさせることができますか? そのような変更が発生する可能性のある場所に警告を表示しますか? 無理だよ。

つまり、結論: 頭痛の種になるだけの悪い考えです。

于 2011-01-02T10:07:17.620 に答える