203

新しい標準(および一部のコンパイラですでに利用可能な部分)が登場すると、新しいタイプstd::unique_ptrはの代わりになるはずですstd::auto_ptr

それらの使用法は正確に重複していますか(コードでグローバルな検索/置換を実行できます(これを実行するわけではありませんが、実行した場合))、またはドキュメントを読んでも明らかではないいくつかの違いに注意する必要がありますか?

また、それが直接の置き換えである場合、単に改善するのではなく、なぜ新しい名前を付けるのstd::auto_ptrですか?

4

4 に答える 4

230

auto_ptr(既知の結果を伴う)をコピーできるため、グローバルな検索/置換を行うことはできませんが、unique_ptr移動することしかできません。のように見えるもの

std::auto_ptr<int> p(new int);
std::auto_ptr<int> p2 = p; 

少なくともこのようになる必要があります

std::unique_ptr<int> p(new int);
std::unique_ptr<int> p2 = std::move(p);

その他の違いについては、unique_ptr配列を正しく処理できます(はを呼び出しますがdelete[]auto_ptrはを呼び出しますdelete

于 2010-08-10T16:27:41.513 に答える
100

std::auto_ptrstd::unique_ptrいくつかの点で互換性がなく、他の点では交換が減少します。したがって、検索/置換は十分ではありません。ただし、検索/置換後、コンパイルエラーを処理すると、奇妙なコーナーケースを除くすべてが修正されます。コンパイルエラーのほとんどは、を追加する必要がありますstd::move

  • 関数スコープ変数:
    値で別の関数に渡さない限り、100%互換性があります。
  • 返品タイプ:
    100%互換ではありませんが、99%互換は間違っていないようです。
  • 値による関数パラメーター:
    1つの警告と100%互換性があり、unique_ptrsは呼び出しを通過する必要がありstd::moveます。これは単純です。正しく理解しないとコンパイラが文句を言うからです。
  • 参照による関数パラメータ:
    100%互換性があります。
  • クラスメンバー変数:
    これは注意が必要です。 std::auto_ptr■コピーのセマンティクスは悪です。クラスがコピーを許可しない場合はstd::unique_ptr、置換のドロップです。ただし、クラスに妥当なコピーセマンティクスを与えようとした場合は、std::auto_ptr処理コードを変更する必要があります。あなたがそれを正しく理解しないとコンパイラが文句を言うので、これは簡単です。特別なコードなしstd::auto_ptrでメンバーがいるクラスのコピーを許可した場合は、恥ずかしくて幸運を祈ります。

要約すると、std::unique_ptrは途切れることはありませんstd::auto_ptr。を使用するとエラーになることが多いコンパイル時の動作は許可されませんstd::auto_ptr。したがって、std::auto_ptr必要な注意を払って使用した場合、への切り替えstd::unique_ptrは簡単です。の奇妙な振る舞いに依存している場合はstd::auto_ptr、とにかくコードをリファクタリングする必要があります。

于 2010-08-10T16:26:33.973 に答える
37

AFAIKunique_ptrは、直接の代替品ではありません。それが修正する主な欠陥は、所有権の暗黙の譲渡です。

std::auto_ptr<int> a(new int(10)), b;
b = a; //implicitly transfers ownership

std::unique_ptr<int> a(new int(10)), b;
b = std::move(a); //ownership must be transferred explicitly

一方、unique_ptr完全に新しい機能があります:それらはコンテナに保存することができます。

于 2010-08-10T16:27:46.990 に答える
35

ハーブサッターはGotW#89について素晴らしい説明をしています:

auto_ptrとの取引は何ですか?auto_ptrは、C++が移動セマンティクスを持つ前にunique_ptrを作成する勇敢な試みとして最も慈善的に特徴付けられます。auto_ptrは非推奨になり、新しいコードでは使用しないでください。

既存のコードベースにauto_ptrがある場合、機会があれば、auto_ptrをunique_ptrにグローバルに検索して置換してみてください。ほとんどの使用法は同じように機能し、(コンパイル時のエラーとして)公開したり、(サイレントに)修正したりする可能性があります。

つまり、グローバル検索と置換によってコードが一時的に「破損」する可能性がありますが、とにかく実行する必要があります。コンパイルエラーの修正には時間がかかる場合がありますが、長期的にはより多くの問題を回避できます。

于 2014-10-03T09:25:42.930 に答える