tixture55’s diary

主にプログラミング関係の日記です。

windowsアプリケーションにおけるメモリリークの防止

メモリリークは不要になったメモリを解放できなかった場合に発生するバグです。

特定のアプリケーションだけでなく、OSのパフォーマンスにも影響が出る場合があります。 大規模なリークが発生すると、ページ切り替えが何度も行われ、応答時間が許容範囲を超える場合があります。

 

一般的なメモリの割り当てパターンは次の通りです。

● HeapAlloc関数、またはC/C++ランタイムの対応する関数(mallocやnew)によるヒープメモリの割り当て

● VirtualAlloc関数によるOSからの直接割り当て

● CreateFile, CreateEvent, CreateThreadなどのKernel32 APIによって作成され、アプリケーション用に カーネルメモリを保持するカーネルハンドル

 

●User32およびGdi32 APIによって作成されたGDIハンドルやUSERハンドル

 

□ベストプラクティス メモリリークの検出と診断を行う最初の手順はアプリケーションのリソースの監視をすること Windowsタスクマネージャを使用して[コミットサイズ][ハンドル][USERオブジェクト]といった列を追加します。 長時間にわたってリソースの使用量を監視できるようになる。
Commit Size   Handles   Threads   USer Objects   GDI  Objects

 

 

ツール

●パフォーマンスモニターとリソースモニタはwindows 7に付属し、長時間にわたってリソースの使用量を監視して

●パフォーマンスモニターとリソースモニタはwindows 7に付属し、長時間にわたってリソースの使用量を監視して グラフに表示します。

●最新バージョンのApplication VeriferはWindows 7のヒープメモリのリークを受診できます。

●Xperfはヒープ割り当てのトレースをサポートする高度なパフォーマンス分析ツールです。 ●CRTデバッグヒープはヒープ割り当てを追跡し、ヒープをデバックする独自の構築に役立ちます。

 

コーディング手法、設計

●ヒープ割り当てにもカーネルハンドルなどのWin32リソースにも、C++コードのスマートポインターを使用する。 C++標準ライブラリにはヒープ割り当て用にauto_ptrクラスが用意されています。 他の種類の割り当てには、独自のクラスを作成する必要があります。

 

●関数からの複数の終了経路を使用しない。関数のスコープ内での変数割当てには関数の最後にある 特定の1つのブロックで解放するようにします。