5

auto_ptr を使用する既知のすべての利点に加えて、auto_ptr の「ワースト プラクティス」とは何ですか?

  1. auto_ptrs の STL コントレーナーの作成。auto_ptrs は「CopyConstructable」要件を満たしていません。Scott Meyer の「Effective STL」の項目 8 も参照してください。

  2. 配列の auto_ptr の作成 破棄時に、auto_ptr のデストラクタは「delete」を使用して (決して「delete[]」は使用しない)、所有しているオブジェクトを破棄するため、このコードは未定義の動作を引き起こします。

  3. auto_ptr メンバーを使用するクラスで copy-ctor と op= を処理しない。auto_ptr メンバーを使用することで、クラスのコピー コンストラクター/代入演算子を実装する必要がないと素朴に考えるかもしれません。ただし、単一の auto_ptr メンバーでさえ、クラスを「毒殺」します (つまり、「CopyConstructable」および「Assignable」の要件に違反します)。このようなクラスのオブジェクトは、コピー/割り当て操作中に部分的に破損します。

他にも auto_ptr の落とし穴はありますか?

4

1 に答える 1

6

これが落とし穴/落とし穴かどうかはわかりませんが、明らかではないことは確かです。

  • const auto_ptr は、含まれているポインターの所有権を譲渡できません

言い換えると:

const auto_ptr<Foo> ap(new Foo());
auto_ptr<Foo> ap2;

ap2 = ap; // Not legal!

これは実際、auto_ptr 引数を取り、含まれているポインターの所有権を取得しないことを保証したい場合に非常に役立ちconst auto_ptr<Foo>ますが、 が のように動作することを期待する場合にも驚くべきことですFoo const*

于 2010-09-01T19:11:38.503 に答える