_std::unique_ptr
_の登場により、傷のついた_std::auto_ptr
_をようやく休めるようになりました。そのため、過去数日間、スマートポインタを使用し、すべてのdelete
をコードから削除するようにコードを変更しています。
Valgrindは私のコードはメモリクリーンであると言っていますが、スマートポインタのセマンティックの豊富さにより、コードがよりクリーンで理解しやすくなります。
ほとんどのコードでは、変換は単純です。所有するオブジェクトが保持する生のポインタの代わりに_std::unique_ptr
_を使用し、delete
を破棄して、慎重にget()
を振ります。必要に応じて、reset()
およびmove()
を呼び出して、残りのコードと適切にインターフェースします。
私は非所有の生のポインタをスマートポインタに変換しているところです。
オブジェクトの存続期間に注意していたので(モジュールが一方向にのみ依存することを確認しています)、valgrindは、初期化されていない読み取り、ダングリングポインター、またはリークがないことを教えてくれます。したがって、技術的には、これらの所有していない生のポインタをそのままにしておくことができます。
ただし、オプションの1つは、これらの非所有rawポインターを_std::shared_ptr
_に変更することです。または、生のポインタのままにしておく方が良いでしょうか?
スマートポインターのベテランユーザーから、どのような経験則を使用して非所有の生のポインターを保持するか、またはそれらを_std::shared_ptr
_、に変換します。コードのユニットテストとvalgrindを常に行うことを覚えておいてください。
編集:_std::shared_ptr
_の使用を誤解している可能性があります-_std::unique_ptr
_と組み合わせて使用できますか、または_std::shared_ptr
_を使用する場合、すべてのハンドルも_std::shared_ptr
_?
個人的には、これは私が(多かれ少なかれ)行う方法です:
はるかに、私はshared_ptrsよりもunique_ptrsを多く使用し、ウィークポインターよりもrawポインターを使用しています。
リソースを所有する複数のものが必要な場合はshared_ptr
を使用し(所有しているものが「ランダム」にスコープから出入りする場合があります)、単一のものがリソースを所有している場合はunique_ptr
を使用し、参照するだけで所有しない場合の生のポインタ(この参照が、リソースが存在する期間より長く続くことはないと予想されます)。
4番目のタイプは、shared_ptr
と呼ばれる、weak_ptr
の生のポインタの一種です。これを使用して、実際には所有せずにshared_ptr
を参照します。その後、オブジェクトがまだ存在するかどうかを確認して使用できます。
標準ライブラリで所有していない唯一のスマートポインタはstd::weak_ptr
です。ただし、それを使用するには、実際に所有するオブジェクトが指示先をstd::shared_ptr
に保持する必要があります。
以前にstd::unique_ptr
を使用したと思います。これらを今すぐshared_ptr
に変換すると、所有していないポインターが参照されていることを所有していないポインターが認識できるという利点がありますが、所有していないコンポーネントは、未所有のポインターがぶら下がったままにすることができます。これを検出します。ただし、shared_ptr
はunique_ptr
よりも(非常に?)小さなパフォーマンスとメモリオーバーヘッドが発生します。
個人的には、1つのshared_ptr
の代わりに1つのweak_ptr
と多くのunique_ptr
sを使用することをお勧めします。一般的なケースでは、多くのrawポインターを使用し、本当にパフォーマンスの問題がある場合はunique_ptr
を使用します。