4

了解しました。私のプログラムでメモリリークが発生している可能性があります。これはSDLアプリケーションであり、リークを手動で特定するには大きくなりすぎたようです。Valgrindに相当するWindowsを探し回って(Windows 7 x64を実行していて、Visual Studio 2010を使用しています)、最終的にVisualLeakDetectorに出くわしました。残念ながら、それはay出力を生成したくないようです。

別のプロジェクト、空のコンソールアプリケーションをセットアップし、SDLアプリと同じ方法でVLDをセットアップしました。プログラムを実行すると、VLDは完全に機能し、私が投げたすべてのメモリリークを検出しました。ただし、SDLアプリでは、「VisualLeakDetectorバージョン2.2がインストールされています」と出力するだけです。main関数で意図的にメモリリークを作成した場合でも、デバッグセッションの開始時と他には何もありません。

私が知ることができる最も近いのは、プログラムのエントリポイントとのSDLのねじ込みに関係している可能性があります。しかし、それは単なる推測です。VLDをSDLで動作させる方法はありますか?

4

2 に答える 2

2

あなたはしようとすることができdeleakerます。これは、メモリリークをデバッグするための強力なツールです。

于 2011-12-21T20:19:19.023 に答える
0

SDLライブラリを使用しても同様の問題が発生しました。ただし、私の場合は、サードパーティのライブラリ/アプリケーションを使用したくなかったため、VisualStudio2010のデフォルトのメモリリーク検出を使用しようとしていました。

問題の修正

必要なインクルード、定義、関数呼び出しをすべて行ってもメモリリークが出力されない場合は、ランタイムライブラリが正しく設定されていない可能性があります。

非デバッグバージョン(/MTおよび/MD)ではなく、デバッグバージョンのランタイムライブラリがあるかどうかを再確認してください。

マルチスレッドデバッグ(/ MTd)

マルチスレッドデバッグDLL(/ MDd)

/MTdまたは/Mddオプションを指定すると、コンパイラーは_DEBUGを定義します。これらのオプションは、Cランタイムライブラリのデバッグバージョンを指定します。_DEBUGリファレンスMSDNを参照してください

したがって、CRTコードを有効にするには、_DEBUGシンボルを定義する必要があります。

[...] _DEBUGが定義されていない場合、_CrtSetDbgFlagへの呼び出しは前処理中に削除されます[...]。MSDNリファレンスを参照してください

したがって、デバッグビルドをビルドするだけでは、_DEBUGを確実に定義することはできません。

これは通常のプロジェクトでは通常変更しないものですが、SDLのチュートリアルに従うと、私がそうであったように導くことができます。

うまくいけば、それは他の誰か、あるいはあなたさえも助けるでしょう。

以下の詳細

私はMSDNページに従って、VS2010でメモリリーク検出をすぐに有効にしました。

それらを宣言した後

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

それらをコードで有効にし、意図的なメモリリークを挿入しました

int main( int argc, char* args[] )
{
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
    _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );

    int *pArray = (int*)malloc(sizeof(int) * 24); // Memory not freed

    return 0;
}

何も印刷されませんでした。

それで、私はアセンブリを調べました、そしてあなたが見ることができるようにそれは明らかにCRTコードをまったく生成していませんでした:

int main( int argc, char* args[] )
{
012932F0  push        ebp  
012932F1  mov         ebp,esp  
012932F3  sub         esp,0CCh  
012932F9  push        ebx  
012932FA  push        esi  
012932FB  push        edi  
012932FC  lea         edi,[ebp-0CCh]  
01293302  mov         ecx,33h  
01293307  mov         eax,0CCCCCCCCh  
0129330C  rep stos    dword ptr es:[edi]  
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
    _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG ); // Nothing in both case!

    int *pArray = (int*)malloc(sizeof(int) * 24);
0129330E  mov         esi,esp  
01293310  push        60h  
01293312  call        dword ptr [__imp__malloc (129E4CCh)]  
01293318  add         esp,4  
0129331B  cmp         esi,esp  
0129331D  call        @ILT+580(__RTC_CheckEsp) (1291249h)  
01293322  mov         dword ptr [pArray],eax  

次に、_DEBUGシンボルがおそらく定義されていないことに気付きました。

于 2012-06-22T08:25:17.637 に答える