C++ スマート ポインターの種類と使用シナリオ

1. ポインタ管理のジレンマ

  1. リソースが解放され、ポインタが null に設定されていない ワイルド
    ポインタ: 1 つのポインタのみがリソースを指している ポインタの
    ダングリング: 複数のポインタが同じリソースを指している
    メモリを踏む

  2. リソースが解放されず、メモリ リークが発生する

  3. リソースを繰り返し解放するとコアダンプが発生する

2.どうやって解決しますか?

  1. スマート ポインタは、RAI アイデアを使用して、ポインタが指す動的リソースの解放を自動的に管理します。

  2. RAI は主にオブジェクトのライフサイクルを使用してプログラム リソースを制御します。

  3. スマート ポインターはクラスのコンストラクターとデストラクターを使用してリソースを管理します

3. スマートポインターの種類

1.shared_ptr

セマンティクス: 共有所有権

リソースには明確な所有者がいません

原則: 参照カウント

シナリオ: ポインタはコンテナ内で管理され、リソースは関数を介して渡されます。

利用規約:

  • 共有 PTR を使用して動的リソースを管理する場合は、元の生のポインタを使用しないでください。
    スマート ポインタを構築する場合は、生のポインタを公開しないでください。スマート
    ポインタの構築には make_shared を使用してください。get
    を通じて生のポインタを操作しないでください。
    単一のポインタを使用しないでください。複数のスマート ポインター オブジェクトを構築します。
  • クラスオブジェクトポインタ(this)をshared_ptrとして使用するには return
  • 生のポインタを公開できません

2.weak_ptr

補助shared_ptr。弱い参照は強い参照カウントを占有しないため、shared_ptr循環参照を解決するために使用されます。

3.unique_ptr

セマンティクス: 排他的所有権、
コピー コンストラクター、
代入演算子なし、
移動コンストラクターと移動代入のみが提供される

オブジェクトの所有者は 1 人だけであることを明確にする

利用規約:

  • コピーはサポートされていませんが、関数から unique_ptr を返すことができます。コンパイラー
    の最適化。
    コンパイラーの最適化がオフの場合: 移動コンストラクターがある場合は、移動コンストラクターを呼び出します。コピー コンストラクターがある場合は、コピー コンストラクターを呼び出します。コピー コンストラクターがない場合、エラーが報告されます。

  • ユニークにするが C++14 でのみ提供される


Lingsheng Academy のプロジェクト クラスをお勧めします。個人的には先生の教え方が上手だったと思います。共有したいと思います:
Lingsheng Platinum Learning Card (インフラストラクチャ/高性能ストレージ/golang クラウド ネイティブ/オーディオとビデオ/Linux カーネルを含む)
https://xxetb.xet .tech/s/VsFMs

おすすめ

転載: blog.csdn.net/qq_40135848/article/details/132942718