Win32アプリケーションのメモリリーク検出手順を紹介します。2006)から導入された新しいメモリマネージャFastMMでの方法、またその効果についても検証します。MemCheckによるメモリリークの検出Delphiでは、これまで、MemCheckと呼ばれるフリーのメモリリーク検出ツールを使って、比較的簡単にメモリリーク箇所を発見できました。ダウンロードできます。MemCheckの使用方法は、簡単です。・ダウンロードしたMemCheck.pasを、プロジェクトに追加します。呼び出しを追加します。Application.Run;end.・「スタックフレームの生成」をONに設定します。・「TD32デバッグ情報を含める」をONに設定します。以上の準備作業が完了したら、プログラムを実行します。次のような、メモリリークの原因となるコードを含むアプリケーションを実行します。破棄されていないend;すると、プログラム終了時に、次のようなログファイルが生成されます。***ログファイルを見れば分かるように、MemCheckは、メモリリークが発生したファイルの行番号をレポートします。これにより、簡単にメモリリーク箇所を特定し、対策を立てることができます。2006)では、MemCheckを使用することができません。2006のコンパイラの仕様が変更されたことと、新たに導入されたメモリマネージャFastMMによりメモリ管理の仕組みが変更されたためです。2006の新しいメモリマネージャ」を参照してください。FastMMは、標準でメモリリーク検出機能を備えています。アプリケーションに以下のコードを一行追加するだけで、FastMMを使用したDelphiアプリケーションは、終了時にメモリリークを報告します。2006に付属するFastMMは、メモリリークの検出を報告するダイアログボックスを表示するだけで、どの行でメモリリークが発生したかまでは報告しません。2006に付属するFastMMは、メモリリークの検出を報告するダイアログボックスを表示するだけで、どの行でメモリリークが発生したかについてまでは報告しません。Win32向けのメモリマネージャです。プロジェクトをダウンロードすれば、最新かつフルセットのFastMMを入手できます。ダウンロード版FastMMに含まれるフルデバッグモードFastMMを使用すれば、メモリリーク検出で、その発生箇所を特定できる詳細なログファイルを出力できます。フルデバッグモードのFastMMを使用するには、次のようにします。ロードされるように変更します。BorlndMM.dll」がロードされるようにします(FastMM_FullDebugMode.dll)が実行時に必要)。・「スタックフレームの生成」をONに設定します。・「TD32デバッグ情報を含める」をONに設定します。2006のIDEを起動しておきます。以上の準備が完了したら、プログラムを実行します。プログラムを実行すると、終了時にダイアログボックスが表示されます。いうファイル名のログファイルが出力されます。TMyClass......プログラム終了時に、まれにAVエラーが発生してプログラムが停止してしまうことがあります。この場合でも、ログファイルは生成されていますので、タスクマネージャやIDE上で強制終了させてかまいません。本稿では、主にDelphiアプリケーションのメモリリーク検出手順について取り上げましたが、FastMMが具体的にどの程度メモリ管理を最適化しているかについて、市販のプロファイリングツールを使用してテストしてみたいと思います。Technologies社のLTProfという49.95ドルのDelphi/C++Builderに対応したCPUプロファイラ製品です。TD32デバッグ情報を付加すれば、Delphi/C++Builderいずれのアプリケーションのプロファイリングも可能です。LTProfを使用するのは、簡単です。オプションで、「TD32デバッグ情報を含める」と「デバッグ版DCUを使う」をONに設定するだけです。アプリケーションを実行すると、図のようなプロファイリング情報を表示します。2006)での、メモリマネージャの動作を比較するために、以下のようなコードを準備しました。IntToStr(e-s);end;ここでは、TStringListを使った重いループ処理を記述し、メモリの再割当が頻繁に発生する事態を人工的に作り出しました。2006の場合941と、2倍以上の開きが出ました。7の場合、大量のTStringList.Addに伴うメモリの再配置処理(ReallocMem、Move)が発生し、これが最も大きいウェイトを占めています。IntToStrメソッド(Sysutils::CvtInt)は、メモリ再配置処理の次に時間がかかる処理でした。2006では、IntToStr(Sysutils::CvtInt)が最も大きいウェイトを占めています。Sysutils::CvtIntの実装内容は、Delphi7とBDS2006とで同一であるため、この差は、単純に、TStringList.Addに伴うメモリの再配置処理が激減し、結果としてIntToStrが目立つことになった、言い換えれば、メモリの再配置処理で著しいパフォーマンス向上があったということです。2006のプロファイリング結果まとめこのように、フリーで入手できるツールや廉価なツールを組み合わせれば、Delphiアプリケーションの品質向上を効率的に行うことができます。アプリケーションの品質を高めるには、コーディングの定石を覚えたり、背後のアーキテクチャを理解することも重要ですが、ケアレスミスや発見しにくいミスはなかなか防ぐことはできません。このようなケースにも対応できるように、メモリリーク検出の手立てを講じておくことは重要です。