6

共有ポインタに関するいくつかのメモを読んでいます。彼らは、auto_ptr を使用した STL による最初の試みには、次のような大きな欠点があったと言います。

  • STL コンテナでは使用できません
  • auto_ptr をコピーすると所有権が譲渡されます
  • auto_ptr を関数に渡すと、効果的にシンクになります

最初の 2 つは理解できますが、最後の 1 つは何を意味するのかわかりません。

誰かがこれを説明してくれませんか。

ありがとう。

4

3 に答える 3

10

これは、auto_ptrを変数にコピーすると、新しい変数へのポインターの所有権が失われるためです。

あなたが持っているとき:

void foo(std::auto_ptr<bar> x);

で呼び出すfooと、 forの使用auto_ptrのコピーが作成されます。これにより、所有権が に効果的に転送されるため、ポインタは終了後に削除されます。auto_ptrfoofoofoo

これは本当に驚くべき動作であり、私はauto_ptr. tryブロック内の単純な RAII (auto_ptr書籍で説明されている の主な使用例) の場合は、 を使用しますboost::scoped_ptr

于 2011-07-31T16:23:12.313 に答える
6

基本的に、auto_ptr所有権を割り当て先のポインターに転送します。
関数に渡すauto_ptrと、ポインターの所有権が関数の引数で受け取るポインターに転送されます。このポインターのスコープは関数の本体までであるため、関数が終了するとポインターは削除されます。

これについては、auto_ptr の効果的な使用 を参照してください。ハーブ・サッターは、それを上手にかつ権威を持って説明しています。

于 2011-07-31T16:22:56.653 に答える
0

データシンクとは、データを吸い上げて所有権を取得するものです。

この用語は「パイプライン」の概念に由来し、エンティティのチェーン内の特定のエンティティが「ソース」からデータを取得し、その結果を「シンク」にプッシュします。チェーン内の次のエンティティは同じことを行います。各段階で、エンティティは渡されたデータに対して何もできなくなります。

類推 (および例) により、(ソースとして機能するストリーム) からデータを取得し、いくつかの計算を実行してから、結果を(シンクとして機能するストリーム)std::cinにプッシュすることを検討してください。std::cout完了したら、完了です。結果はエーテルに出ており、元に戻すことはできません。

それが何auto_ptrをするかです: それはあなたが望むかどうかにかかわらず、あなたのデータの所有権を手放します。

于 2019-05-30T10:05:47.237 に答える