shared_ptrの一般的な広範な使用は、ほとんど必然的に、望ましくない、目に見えないメモリ占有を引き起こします。
循環参照はよく知られている原因であり、それらのいくつかは間接的であり、特に複数のプログラマーが作業する複雑なコードでは見つけるのが難しい場合があります。プログラマーは、クイックフィックスとして、あるオブジェクトが別のオブジェクトへの参照を必要とし、サイクルを閉じているかどうかを確認するためにすべてのコードを調べる時間がないと判断する場合があります。この危険は非常に過小評価されています。
あまりよく理解されていないのは、リリースされていない参照の問題です。オブジェクトが多くのshared_ptrsに共有されている場合、それらのすべてがゼロになるかスコープから外れるまで、オブジェクトは破棄されません。これらの参照の1つを見落としがちで、終了したと思っていたオブジェクトがメモリに潜んでいることになります。
厳密に言えば、これらはメモリリークではありませんが(プログラムが終了する前にすべて解放されます)、同様に有害であり、検出が困難です。
これらの問題は、適切な誤った宣言の結果です。1.共有された単一所有権として本当になりたいものを宣言します。scoped_ptrは正しいですが、そのオブジェクトへの他の参照は生のポインターである必要があり、ぶら下がっている可能性があります。2.パッシブ監視参照になりたいものをshared_ptrとして宣言します。weak_ptrは正しいでしょうが、それを使用するたびにそれをshare_ptrに変換する手間がかかります。
あなたのプロジェクトは、この慣習があなたを巻き込む可能性のある種類の問題の良い例だと思います。
メモリを大量に消費するアプリケーションを使用している場合は、デザインがオブジェクトの有効期間を明示的に制御できるように、単一の所有権が本当に必要です。
単一所有権の場合opObject=NULL; 間違いなくオブジェクトを削除し、今それを行います。
共有所有権の場合spObject=NULL; ........知るか?......