メモリ リークと GDI リークがどのように発生するか、およびそのようなリークを削除する方法を学習するために、Winforms で (C を使用して) サンプル コードを記述しようとしています。GUI にいくつかの文字を表示する簡単なアプリケーションを作成しました。
メモリと GDI リソースに関してリークを発生させるにはどうすればよいですか?
メモリ リークと GDI リークがどのように発生するか、およびそのようなリークを削除する方法を学習するために、Winforms で (C を使用して) サンプル コードを記述しようとしています。GUI にいくつかの文字を表示する簡単なアプリケーションを作成しました。
メモリと GDI リソースに関してリークを発生させるにはどうすればよいですか?
GDIリソースをリークしたい場合は、フォントやブラシなどを作成し、それらを破棄しないことでうまくいくはずです。これらは基本的に、DeleteObject
関連するリソースを解放するために呼び出す必要があります(もちろん、プロセスを終了するとクリーンアップされます)。 .
削除が必要としてリストされたオブジェクトの作成を確認することで、リークを追跡DeleteObject
できます。また、もう少し高度な処理を行って、PEB と TEB で未処理の GDI ハンドルを確認することもできます。EnumObjects
この点でも役立つはずです。
私は GDI にはあまり詳しくありませんが、プログラムを別の場所にリークさせるのは非常に簡単です。以前に malloc したメモリを解放するのを忘れるだけです。
例:
int someFunc() {
char* buf = (char*)malloc(50);
// Do stuff
// Should free here like this:
// free(buf);
return 4;
}
解放しないと、メモリにアクセスできないため、メモリがリークされますが、プログラムにはまだ割り当てられています。