CMemoryState 構造体
更新 : 2007 年 11 月
プログラム上でのメモリ リークを検出する便利な手法が用意されています。
struct CMemoryState
解説
CMemoryState は構造体で、基本クラスはありません。
オブジェクト用にヒープ領域に割り当てたメモリを不要になっても解放しなかったとき "メモリ リーク" が生じます。このようなメモリ リークは、最終的にはメモリ不足エラーを引き起こします。プログラムでメモリを割り当て、解放するには以下の方法があります。
ランタイム ライブラリの malloc/free 系の関数を使います。
Windows API のメモリ管理関数、LocalAlloc/LocalFree や GlobalAlloc/GlobalFree を使います。
C++ の new 演算子や delete 演算子を使います。
CMemoryState は、メモリが new 演算子を使って割り当てられ、delete 演算子で解放されなかったときに生じるメモリ リークのみを診断します。ほかの 2 つのグループのメモリ管理関数は C++ ではないプログラムに関するものです。また、これらの関数を new 演算子や delete 演算子と混在して使うこともお勧めできません。メモリを割り当てたファイルや行番号を追跡するには、new 演算子の代わりに使用する付加的なマクロとして DEBUG_NEW が用意されています。DEBUG_NEW マクロは、一般的に new 演算子を使用するところではどこでも使用できます。
その他の診断として、CMemoryState 診断がプログラムのデバッグ環境でのみ利用できます。デバッグ環境では _DEBUG 定数を定義します。
プログラムがメモリ リークを生じていると思われるときは、プログラムの実行時に 2 つの別な場所でオブジェクトが割り当てたメモリの状態の違いを検出するために、Checkpoint、Difference、および DumpStatistics の各関数が使用できます。このことによりオブジェクトが割り当てたメモリのクリーンアップをすべて行っているかどうかを調べることができます。
メモリの割り当てと解放の組み合わせが正しくない箇所を簡単に知るための情報が十分に与えられていないときは、Checkpoint を呼び出した後、オブジェクトが割り当てたメモリをすべてダンプするために、DumpAllObjectsSince 関数が使えます。このダンプでは、メモリを割り当てた順序、オブジェクトがメモリを割り当てたときのソース ファイルとその行番号 (割り当てに DEBUG_NEW マクロを使ったとき)、オブジェクトの派生、オブジェクトのアドレス、オブジェクトのサイズなどを知ることができます。DumpAllObjectsSince 関数は、オブジェクトの現在の状態についての情報を提供するために各オブジェクトの Dump 関数も同時に起動します。
CMemoryState とほかの診断の使い方の詳細については、「MFC のデバッグ技術」を参照してください。
メモ : |
---|
CMemoryState 型のオブジェクトの宣言とメンバ関数の呼び出しは、#if defined(_DEBUG)/#endif ディレクティブで囲みます。これにより、メモリ診断はプログラムのデバッグ ビルドだけに含まれます。 |
必要条件
ヘッダー : afx.h