2

メモリリークとは何かについてのこの回答を読んだ後、オブジェクトがプログラムのすべての実行中に存在するはずnewであり、を介して作成していた場合、そのようなオブジェクトを呼び出す必要はないと結論付けることができdeleteます。

したがって、たとえば、いくつかのメイン ウィンドウと、その上にいくつかの他のウィンドウ/ウィジェットがあり、メイン ウィンドウ コンストラクターで new を使用して作成した場合、メイン ウィンドウ デストラクタが呼び出されるため、デストラクタで delete を呼び出す必要はありません。プログラムが終了するので、メモリ リークではありません。

4

4 に答える 4

3

プログラムがサーブレットなどのより大きなプログラムのモジュールになるまで、その時点でリークが発生します。

また、コード レビューや valgrind の使用がわかりにくくなります。valgrind はそれがリークだと思いますが、他の場所でリークを追跡しようとするたびに、「あれは問題ない」と覚えておく必要があるのはなぜですか?

于 2013-04-06T21:07:22.683 に答える
3

'cos メイン ウィンドウのデストラクタはプログラムの終了時に呼び出されるため、メモリ リークではありません

これはメモリリークですが、プロセス自体がアクティブにこれを行うためのアクションを実行しなくても、プロセスが終了したときにオペレーティングシステムがプロセスで使用されているリソース (少なくともメモリ) を解放するという事実を信頼できます。

ただし、ファイル ハンドルやネットワーク接続など、他の種類のリソースを解放する必要がある場合は、そうではありません。より一般的には、他の種類の責任が、それらの責任を持つプログラムまたはモジュールによって果たされない場合。

メモリをリークさせないことはプログラムの責任であり、作成したモジュールがその責任を果たすようにプログラミングを練習することをお勧めします。この目的で使用されるツールとイディオムは、意味がある場合はいつでも使用することを正当化するのに十分一般的です。たとえば、RAII イディオム (Resource Acquisition Is Initialization)はこの点で基本的なものであり、例にも適用できます - スマート ポインターを使用します。

特定の例では、メモリリークが大きな問題になることはないと述べていますが(1つのオブジェクトについて話しているため、プログラムの実行中にメモリ消費が増加し続けることはありません)、保持する本当の理由はありませんそこに。

于 2013-04-06T21:08:26.843 に答える
2

プログラムを開始すると、プログラムの実行に必要なすべての情報を含むプロセスが OS によって作成されます。
メイン ウィンドウを閉じるなどしてプロセスが破棄されると、OS はメモリからプロセスのイメージを (すぐではなく) クリーンアップし、メモリ リークは表示されなくなります。
p長時間実行されているプロセスがあり、メモリ リークが発生すると、プロセスが停止するか、OS の実行が遅くなり始めると問題になります。

于 2013-04-06T21:07:20.280 に答える
2

コードは時間の経過とともに変化し、オブジェクトがプログラムの存続期間全体にわたって存続するかどうかは誰deleteにもわかりません。に一致deleteするものがなかったことを長い間忘れていましたnew

于 2013-04-06T21:08:11.250 に答える