#Visual Studio 2015のネイティブメモリ診断機能を使用してメモリリークを検出する
Visual Studio 2015には「ネイティブメモリ診断」が新機能として搭載されています。
Visual Studio 2015 における Visual C++ の新機能
2.ネイティブ メモリ診断
a.メモリ診断セッション (Ctrl+Alt+F2)。ネイティブ アプリケーションのメモリ使用をデバッグ セッション中にリアルタイムで監視できます。
b.メモリのスナップショット。アプリケーションのヒープ内容の瞬間的なイメージをキャプチャします。 2 つのメモリ スナップショットを比較すると、ヒープの状態の違いを調べることができます。 アプリケーションを停止した後の各インスタンスのオブジェクト型、インスタンス値、および割り当て呼び出しスタックが表示されます。 各スナップショットの呼び出しツリーがスタック フレームごとに表示されます。
本機能を利用してアプリケーションのメモリリークを検出してみます。
調査環境
- Windows 10Pro
- Visual Studio Community 2015
調査対象プログラム
#include "stdafx.h"
#include "Win32Project1.h"
int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine, _In_ int nCmdShow)
{
while (MessageBox(NULL, TEXT("終了しますか?"), TEXT("確認"), MB_YESNO | MB_ICONQUESTION) != IDYES)
{
char* ch = new char[256]; // メモリリーク!
}
return 0;
}
#メモリリーク検出手順
1.調査対象プログラムのデバッグ実行
[デバッグ(D)]→[デバッグの開始]メニューを押下して調査対象プログラムをデバッグ実行します。
2.処理実行前のスナップショットを作成する
[デバッグ(D)]→[すべて中断(H)]メニューを押下してプログラムを一時中断させます。
次に[デバッグ(D)]→[診断ツールの表示]メニューを押下してネイティブメモリ診断ツールを表示させ、「メモリ使用量」タブの「スナップショットの作成」を押下して、処理実行前のスナップショットを作成します。
3.メモリリークを伴う処理の実行
[デバッグ(D)]→[続行(C)]メニューを押下してプログラムを再開し、該当プログラムの「いいえ」ボタンを押下してメモリリークを伴う処理を実行させます。
4.処理実行後のスナップショットを作成する
[デバッグ(D)]→[すべて中断(H)]メニューを押下してプログラムを一時中断させます。
次にネイティブメモリ診断ツールウィンドウ内「メモリ使用量」タブの「スナップショットの作成」を押下して、処理実行後のスナップショットを作成します。
5.スナップショットの比較
ネイティブメモリ診断ツールウィンドウ内「メモリ使用量」タブの「割り当て(相違)」列の↑項目を押下し、スナップショット間のヒープの差分を表示させます。
本差分情報により、Win32Project1.cppの9行目で確保したchar配列のメモリ領域が解放されず、256バイトのメモリリークが発生していることが確認出来ました。