共有ポインタに関するいくつかのメモを読んでいます。彼らは、auto_ptr を使用した STL による最初の試みには、次のような大きな欠点があったと言います。
- STL コンテナでは使用できません
- auto_ptr をコピーすると所有権が譲渡されます
- auto_ptr を関数に渡すと、効果的にシンクになります
最初の 2 つは理解できますが、最後の 1 つは何を意味するのかわかりません。
誰かがこれを説明してくれませんか。
ありがとう。
これは、auto_ptr
を変数にコピーすると、新しい変数へのポインターの所有権が失われるためです。
あなたが持っているとき:
void foo(std::auto_ptr<bar> x);
で呼び出すfoo
と、 forの使用auto_ptr
のコピーが作成されます。これにより、所有権が に効果的に転送されるため、ポインタは終了後に削除されます。auto_ptr
foo
foo
foo
これは本当に驚くべき動作であり、私はauto_ptr
. try
ブロック内の単純な RAII (auto_ptr
書籍で説明されている の主な使用例) の場合は、 を使用しますboost::scoped_ptr
。
基本的に、auto_ptr
所有権を割り当て先のポインターに転送します。
関数に渡すauto_ptr
と、ポインターの所有権が関数の引数で受け取るポインターに転送されます。このポインターのスコープは関数の本体までであるため、関数が終了するとポインターは削除されます。
これについては、auto_ptr の効果的な使用 を参照してください。ハーブ・サッターは、それを上手にかつ権威を持って説明しています。
データシンクとは、データを吸い上げて所有権を取得するものです。
この用語は「パイプライン」の概念に由来し、エンティティのチェーン内の特定のエンティティが「ソース」からデータを取得し、その結果を「シンク」にプッシュします。チェーン内の次のエンティティは同じことを行います。各段階で、エンティティは渡されたデータに対して何もできなくなります。
類推 (および例) により、(ソースとして機能するストリーム) からデータを取得し、いくつかの計算を実行してから、結果を(シンクとして機能するストリーム)std::cin
にプッシュすることを検討してください。std::cout
完了したら、完了です。結果はエーテルに出ており、元に戻すことはできません。
それが何auto_ptr
をするかです: それはあなたが望むかどうかにかかわらず、あなたのデータの所有権を手放します。