から保有するshared_ptr<>?
-
21-08-2019 - |
質問
使っていブ::shared_ptrアダプタのご使用可能です。メモリーの問題は深刻で、お出かけは大量のメモリを消費します。
しかし、私は毎newedオブジェクトをshared_ptrの場合、申込終了し、メモリ漏えい検出が可能です。
あのようなもの std::vector<shared_ptr<> >
プールを保持します。したらどのようになりますか?者のshared_ptr、デバッグ?
で審査コード線ます。すぎコー---
感謝!
解決
あなただけの「兄弟ポインタが」あるshared_ptr
、を見ることで、知ることができません。あなたは1つがunique()
であるかどうかをテストまたはの中で、use_count()
を得ることができます他の方法はに。
他のヒント
shared_ptrの人気の広範な使用は、ほぼ必然的に不要と目に見えないメモリ占有が発生します。
循環参照はよく知られている原因であり、それらのいくつかは、特に、複数のプログラマが作業されて複雑なコードで見つけることが間接的で困難な場合があります。プログラマは1つの目的は、クイックフィックスとして別の参照を必要とし、彼はサイクルを閉じているかどうかを確認するために、すべてのコードを検討する時間がありませんよりも、決めることができます。この危険性は非常に過小評価されます。
あまりよく理解は、未発表の参照の問題です。オブジェクトは、多くのshared_ptrsに出て共有されている場合はそれらの一つ一つがゼロまたは範囲の外に出るれるまで、それが破壊されることはありません。これらの参照のいずれかを見落とすと、あなたがして終わったと思ったメモリに目に見えない潜んでいるオブジェクトで終わることは非常に簡単です。
厳密にこれらのメモリリークではありません話すが、(それは、すべてのプログラムが終了する前に解放されます)彼らは同じように有害で検出することが困難です。
これらの問題は好都合虚偽の宣言の結果は以下のとおりです。 1.あなたが本当にshared_ptrのような単一の所有になりたいものを宣言。 scoped_ptrを正しいであろうが、そのオブジェクトへの他の参照は、ダングリング残すことができ、生のポインタでなければならないであろう。 2.あなたが本当にshared_ptrのような受動観察参照になりたいものを宣言。 weak_ptrは正しいだろうが、その後、あなたがそれを使用するたびにshare_ptrするためにそれを変換する手間を持っています。
私はあなたのプロジェクトは、この練習はにあなたを得ることができること、トラブルの種類の良い例であると思われます。
あなたは、メモリを集中的に使用するアプリケーションを持っている場合は、あなたのデザインが明示的にオブジェクトの寿命を制御することができるように、あなたは本当に、単一の所有権を必要とします。
単一所有opObject = NULLと;間違いなく、オブジェクトを削除し、それは今それを行います。
の共有所有spObject = NULLと; ........知っている?......
Oneソリューションにぶら下または円形のスマートポインタを参考にしましたがカスタマイズのスマートポインタークラスを追加するデバッグ専用の会計機能です。きsmartpointerトへの参照オブジェクトであり、スタックトレースで、地図が各エントリを追跡
- 住所オブジェクトの割り当てられること(そのポインタをポイント)
- のアドレスの各smartpointerオブジェクトの保持への参照オブジェクト
- に対応するstacktracesのそれぞれのsmartpointerした
がsmartpointerが範囲外になると、そのエントリのmapを返しを削除します。最後のsmartpointerるオブジェクトが破壊され、pointeeオブジェクトがエントリのmapを除去します。
そして、"トラックの漏えい"コマンド機能'[再]開始漏れを追跡"(クリアの全体図および追跡されていない)、"印刷を開参考文献"では、全ての優れたsmartpointer参照を作成した以降に開始漏れを追跡'コマンドを発行します。にすることができるので、スタックトレースのそれらのスマートポインタが簡単に正確に知人のつらされるオブジェクトが解放されます。で遅くした時に、そのものではないでし離れないです。
で公正な金額を実施するため、間違いなく価値がある場合またコードベースが起こる。
あなたはサイクルを介して共有ポインタのメモリリークを経験することができます。何が起こるかは、あなたの共有オブジェクトは、最終的に元につながる他の共有オブジェクトへの参照を保持することができるです。このサイクルを発生した場合でも、誰もオブジェクトにアクセスすることはできませんけれども1で、すべての参照カウントを保持します。解決策は、弱いポインタである。
あなたのコードの一部をリファクタリングしてみます。
あなたのクラス階層を見てみると、それは本当に共有ポインタを保持する必要がありますどのクラスかを決定することは可能だと単にだけ弱いものを必要とするので、「本当の」所有者オブジェクトが破壊された場合は、もしあればサイクルを避けることができ、 「非所有者」オブジェクトがすでになくなってきたはずです。それはいくつかのオブジェクトが早すぎるのポインタを失うことが判明した場合は、アプリ内のオブジェクトの破壊シーケンスに見て、それを修正する必要があります。
だ明らかに持参考文献をオブジェ内です。これまで、目的、ない。これを継続してご利用いただけるメモリリークを引き起こします。メモリリークがメモリが割り当てられ、それまで保管しないでください参考に、そのアドレスです。
基本的に見ていく必要があるデザインをやって、なぜそれを多くの物やデータメモリは、どのようにすることができますの最小化します。
の可能性を持つ擬似メモリリークがいを作り比べますという思いを大切にしています。試しをブレークポイントはすべての計算書を含む'new'.が以上でお申し込みは構築物以外にすべきである、そして読み取るコードです。
この問題はなく、メモリリークとしてこの問題はアプリケーションのデザイン。