2017-07-25 24 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

MSDN topic

這些技術工作內存使用分配標準CRT malloc函數。但是,如果程序使用C++ new 運算符分配內存,則只能看到 內存泄漏報告中 全局運算符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在你的代碼。我測試了它,它可以正確地與你的代碼一起工作。


實際上,在代碼中newDBG_NEW更換到處是太繁瑣的任務,所以可能你可以使用這個宏:

#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 /過載的操作員新到檢測存儲器-泄漏/ – Swift

0

它應該已經在某個地方回答了。

「這些技術使用標準的CRT malloc函數分配內存的工作。如果你的程序中使用C++新 運營商,但是,你需要重新定義新的,如果你想看到的 文件和行分配內存內存泄漏報告中的數字「。

結果你會有新的操作符定義的行。你可以使用新的可以接受額外的參數,其中一些可以被默認爲macrodefinitions價值的伎倆,這樣像__LINE____FILE__

1

檢查出答案here。您希望使用超載的new運算符以及解決方案中指定的附加參數來獲取該信息。

在這種情況下,您的線路

int* q = new int; 

改變

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

,你應該看到的泄漏。