web-dev-qa-db-ja.com

std :: unique_ptrの推奨される使用法

std::unique_ptrの推奨される使用法は、具体的にどこで、いつ、どのように使用するのが最も適切か?

私は発見した:

nique_ptrパフォーマンスについて

もう知っている:

  1. std::unique_ptrstd::auto_ptrの代わりとしてC++ 11で開発されました
  2. std::unique_ptrには参照カウントがなく、ポイントする「所有」オブジェクトがある
  3. std::unique_ptrのコピー/割り当てはありません
  4. 一意のポインターが必要な場合、std::unique_ptrはgo to構造です

私が知りたいこと:

  1. 何かよりstd::unique_ptrを使用している(一意性以外)
    そうしないと?この状況で何が得られますか?
  2. もしそうなら、どのような状況で、いつですか?
  3. 移動セマンティクスの必要性を考えると、これはstd::unique_ptrをあまり好ましくないものにしますか
    全体?
  4. std::shared_ptrがほとんどすべての状況で動的メモリ管理に十分である場合、なぜ私に自由にstd::unique_ptrの問題があるのですか(ここでも、他の
    一意性よりも)?
33
Mushy

理論的には、共有したい場合を除いて、すべてのポインタにunique_ptrを使用する必要があります。その場合、shared_ptrを使用する必要があります。その理由は、unique_ptrは参照をカウントしないため、オーバーヘッドが少ないためです。

ただし、unique_ptrは移動可能ですがコピーはできません。そのため、メンバー変数として使用すると、コードを追加する必要があります(例:moveコンストラクター)。値で渡すと、std::moveなどを使用する必要があります。その結果、一部の人々はshared_ptrを怠惰な状態で使用します。これは簡単なためであり、パフォーマンスの違いはアプリにとって重要ではない可能性があります。

最後に、生のポインタは観察には問題ありません-寿命に影響を与えることのないポインタの使用。正しいポインタタイプを慎重に選択することで、コードを読む人は、あなたが何をしているかをよく理解できます。詳しくは、Herb Sutterのエッセイ Elements of C++ Style 、特に「削除しない」セクションを参照してください。

10
Kate Gregory