オブジェクトにメモリリークがあったかどうかをテストするために、インスタンスを10000回インスタンス化し、10000回削除しました。その後、私のプログラムは約500kbを使いました。私は私のオブジェクトが漏れているとは思わない。 Linuxのこれはヒープフラグメンテーションの兆候ですか?
おかげ
オブジェクトにメモリリークがあったかどうかをテストするために、インスタンスを10000回インスタンス化し、10000回削除しました。その後、私のプログラムは約500kbを使いました。私は私のオブジェクトが漏れているとは思わない。 Linuxのこれはヒープフラグメンテーションの兆候ですか?
おかげ
少なくとも、Cライブラリを使用すると、delete
を呼び出すという理由だけで戻ってOSにメモリを解放しません。それはあなたのプロセス内の "フリーリスト"にメモリを置きます。したがって、top
またはcat /proc/XXX/status
のようなコマンドを使って仮想メモリの使用量を測定すると、その空きリストを含むプロセス内のすべてのものが消費するサイズがわかります。
free
またはdelete
"大きな"オブジェクトがある場合、Cライブラリはメモリをシステムに戻しません。 "large"の定義は128Kバイトのようなものです。
Windows、Macなどは同様に動作すると思われますが、わかりません。
あなたの質問に対する短い答えは「いいえ、必ずしもそうではありません」です。
クラスに実際に含まれているものと含まれているものによって、あなたのクラスがリークしない場合でも、あなたが記述する内容が起こる可能性があります。
いくつかの標準ライブラリの実装では、メモリプールからstd::string
のようなクラスを割り当てます。
テスト実行の代わりにvalgrindのような実際のリークチェッカーを使用する必要があります。
どのオペレーティングシステムですか?あなたの「プログラムが約500kb以上を使用していた」ことをどのようにして知っていますか? – Nemo