2017-07-25 7 views
0

私はFinding Memory Leaks Using the CRT Libraryに基づいて、メモリリークの行番号を印刷する必要があります、私は思う、以下のコードがあります。CRTはメモリリークの行番号を表示しません

#include "stdafx.h" 
#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 
#include <iostream> 


void derp() 
{ 
    int* q = new int; 

} 

int main() 
{ 
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
    derp(); 
    return 0; 
} 

私はそれを実行すると、私は次を得る:マイクロソフトのドキュメントに基づいて

Detected memory leaks! 
Dumping objects -> 
{75} normal block at 0x0067E930, 4 bytes long. 
Data: < > CD CD CD CD 
Object dump complete. 

、私は漏れやすいメモリが割り当てられたラインのプリントアウトを見ることを期待したいが、私はしません。

どうしたのですか?私はVS2015を使用しています。

+0

https://stackoverflow.com/q/3202520/4009370 –

答えて

2

などの追加パラメータとそれらのいくつかはmacrodefinitionsの値にデフォルト設定することができますが、受け入れることができるトリックを使用することがあります。

これらの技術を使用して割り当てられたメモリのために働きます標準CRT malloc関数です。ただし、プログラムでC++の新しい演算子 を使用してメモリを割り当てる場合、 メモリリークレポートでグローバル演算子newの実装 が_malloc_dbgを呼び出すファイルと行番号のみが表示されます。

#ifdef _DEBUG 
    #define DBG_NEW new (_NORMAL_BLOCK , __FILE__ , __LINE__) 
    // Replace _NORMAL_BLOCK with _CLIENT_BLOCK if you want the 
    // allocations to be of _CLIENT_BLOCK type 
#else 
    #define DBG_NEW new 
#endif 

をそしてDBG_NEWであなたのコード内でnewを置き換えます。その動作は非常に有用ではありませんので、あなたは 次のようになりますマクロ を使用して割り当てをしたラインを報告し、それを変更することができます。私はそれをテストし、あなたのコードで正しく動作します。


実際には、コード内のどこでもDBG_NEWnewを交換するので、おそらくあなたは、このマクロを使用することができ、あまりにも退屈な作業です:

#ifdef _DEBUG 
    #define new new(_NORMAL_BLOCK , __FILE__ , __LINE__) 
#else 
    #define new new 
#endif 

私はこの方法をテストし、それはあまりにも動作します。

+0

いいです。しかし、そのオファーは時代遅れです。新しいhttps://blogs.msdn.microsoft.com/calvin_hsia/2009/01/をオーバーロードすることができます。 19/overload-operator-new-to-detect-memory-leaks / – Swift

0

すでに回答があったはずです。

「これらの技術は、標準的なCRT malloc関数を使用して割り当てられたメモリのために働く。あなたのプログラムがC++を使用し、あなたが ファイルと行を見たい場合は、新規に 演算子、しかし、あなたは新しい再定義する必要がメモリを割り当てた場合メモリリークレポートの数字。

結果として、新しい演算子定義の行が表示されます。あなたは新しいがMSDN topicからそのような__LINE____FILE__

1

hereを確認してください。その情報を得るために、オーバーロードされたnew演算子をそこにあるソリューションで指定されている追加パラメータで使用したいとします。この場合

、あなたのラインが

int* q = new (_NORMAL_BLOCK, __FILE__, __LINE__) int; 

int* q = new int; 

を変更すると、あなたはリークが表示されるはずです。

関連する問題