_CrtDumpMemoryLeaks() の結果が出力されません。

huahi11115 355 評価のポイント
2024-11-05T07:36:26.5733333+00:00

Microsoft Visual Studio Community 2022 (64 ビット) - Current

Version 17.11.5 .Net Framework 4.8.09037

メモリーリークを検知してその情報を表示する関数 _CrtDumpMemoryLeaks を使いたいと思っています。

言語使用では、メモリ リークが発生したときに、デバッグ ヒープ内のすべてのメモリ ブロックをダンプします (デバッグ バージョンのみ)。となっていますが、どこに出力されるかが記載されていません。

https://learn.microsoft.com/ja-jp/cpp/c-runtime-library/reference/crtdumpmemoryleaks?view=msvc-170

言語はC++/CLIですが、C++を使う場合とプログラムの組み方は変わらないと思います。

#include <crtdbg.h> はインクルードしています。

int y1 = 9;

int* arr1 = new int[y1];

_CrtDumpMemoryLeaks();

Debug::Print("-----");

出力先は、出力ウィンドウで、出力元を「デバッグ」にしていますが、

結果は「-----」のみです。

どうすれば出力結果を見ることができますか。

あと、(デバッグ バージョンのみ) とは、どういう意味ですか。

Visual Studio
Visual Studio
Windows、Web、モバイル デバイス用のアプリケーションを構築するための統合開発ツールの Microsoft スイートのファミリ。
103 件の質問
0 件のコメント コメントはありません
{count} 件の投票

承認済みの回答
  1. gekka 10,561 評価のポイント MVP
    2024-11-05T09:52:28.2466667+00:00

    ほぼ初期状態のC++/CLIコンソールでテストすると普通に出力ウィンドウに表示されましたよ。

    20241105

    #include "pch.h"
    #include <iostream>
    
    using namespace System;
    
    public ref class TestClass1
    {
    public:
        TestClass1() :pv(NULL)
        {
            *(pv = (int*)malloc(sizeof(int))) = 1234;
        }
        ~TestClass1()
        {
            free(pv);
        }
    public:
        int* pv;
    };
    
    void Test1()
    {
        TestClass1^ c1 = gcnew TestClass1();
        std::wcout << *c1->pv << std::endl;
    }
    
    void Test2()
    {
        _CrtDumpMemoryLeaks();
    
        __debugbreak();
    }
    
    int main(array<System::String^>^ args)
    {
        //出力ウィンドウに表示(デフォルト)
        _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG);
    
        //ダイアログに表示
        //_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_WNDW);
    
        //ファイルに出力
        //HANDLE hfile=  CreateFile(L"Test.dump", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,   NULL);
        //if (hfile)
        //{
        //    _CrtSetReportFile(_CRT_WARN, hfile);
        //    _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
        //}
        
        Test1();
        Test2();
    
        //if (hfile)
        //{
        //    CloseHandle(hfile);
        //}
    }
    

    デバッグバージョンというのは、ランタイムライブラリをデバッグ用のバージョンにリンクしているという意味です。
    提示されている_CrtDumpMemoryLeaksのページ内のリンクの_DEBUGに説明があります。

    「メニュー->プロジェクト->プロパティ->構成プロパティ->C/C++->コード生成->ランタイムライブラリ」が マルチスレッドデバッグDLL(/MD) または マルチスレッドデバッグDLL(/MDd)になっていると、デバッグ用のランタイムライブラリにリンクされます。 そうでない場合はリリース用のライブラリにリンクされて、デバッグ用関数は実行されなくなります。 つまり、デバッグウィンドウに表示されない場合にはリリースの設定になっているか、CrtSetReportModeでほかの方法に設定されている可能性があります。

    1 人がこの回答が役に立ったと思いました。

0 件の追加の回答

並べ替え方法: 最も役に立つ

お客様の回答

回答は、質問作成者が [承諾された回答] としてマークできます。これは、ユーザーが回答が作成者の問題を解決したことを知るのに役立ちます。