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シンボルがおそらく定義されていないことに気付きました。