1. ポインタ管理のジレンマ
-
リソースが解放され、ポインタが null に設定されていない ワイルド
ポインタ: 1 つのポインタのみがリソースを指している ポインタの
ダングリング: 複数のポインタが同じリソースを指している
メモリを踏む -
リソースが解放されず、メモリ リークが発生する
-
リソースを繰り返し解放するとコアダンプが発生する
2.どうやって解決しますか?
-
スマート ポインタは、RAI アイデアを使用して、ポインタが指す動的リソースの解放を自動的に管理します。
-
RAI は主にオブジェクトのライフサイクルを使用してプログラム リソースを制御します。
-
スマート ポインターはクラスのコンストラクターとデストラクターを使用してリソースを管理します
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