2013-11-20 31 views
18

मैं मेमोरी रिसाव का पता लगाने की कोशिश कर रहा हूं, और मैं लीक क्षेत्र कहां ढूंढने के लिए _CRTDBG_MAP_ALLOC मैक्रो बनाने का उपयोग कर रहा हूं। तो मैं निम्नलिखित की तरह मैक्रो को परिभाषित कर रहा हूँ:_CRTDBG_MAP_ALLOC फ़ाइल नाम नहीं दिखा रहा है

#ifdef _DEBUG 
    #define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 
    #define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) 
    #define new DEBUG_NEW 
#endif 

मेरे कोड में, मैं है:

UINT SomeFunThread(LPVOID pParam) 
{ 
    _CrtMemState crtMemStateStart; 
    _CrtMemState crtMemStateFinish; 

    _CrtMemCheckpoint(&crtMemStateStart); 


    // My suspisious code 


    _CrtMemCheckpoint(&crtMemStateFinish); 

     int nDifference(0); 
     _CrtMemState crtMemStateDifference; 
     nDifference = _CrtMemDifference(&crtMemStateDifference, &crtMemStateStart, &crtMemStateFinish); 

    if(nDifference > 0) 
     _CrtDumpMemoryLeaks(); 

    return 0; 
} 

(धन्यवाद तुषार जाधव को: Memory consumption increases quickly, then drops very slowly; memory leak?)

लेकिन उत्पादन की तरह कुछ पता चलता है:

Detected memory leaks! 
Dumping objects -> 
{124058} normal block at 0x0000000031DED080, 24 bytes long. 
Data: < 0  ` $  > C8 30 F7 EF FE 07 00 00 60 D2 24 1D 00 00 00 00 

इस तरह के कुछ के बजाय:

Detected memory leaks! 
Dumping objects -> 
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18} 
normal block at 0x00780E80, 64 bytes long. 
Data: <    > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
Object dump complete. 

तो मैं इस शो को फ़ाइल नाम और रिसाव का स्थान कैसे बना सकता हूं?

+0

कोड आवंटित करता है कि सिर्फ अपने #defines साथ संकलित नहीं किया गया था प्रभाव में। लाइब्रेरी में स्थित हो सकता है, डीएलएल में प्रीबिल्ट सी ++ टेम्पलेट क्लास स्पेशलाइजेशन की तरह हो सकता है। या लीक रिपोर्ट उत्पन्न होने से पहले डीएलएल कोड को अनलोड कर दिया गया था। –

+0

@ हंसपैसेंट तो क्या आप कहते हैं कि यह मेरा "संदिग्ध कोड" नहीं था जो लीक; यह कुछ कोड/bianraies/dlls था जो "संदिग्ध कोड" के भीतर बुलाया जाता है? –

+0

मैं कहूंगा कि यह वह कोड है जिसे आपने नहीं मिला है, कहीं भी हो सकता है। लीक के साथ सामान्य समस्या, है ना? यदि आप दोहराने के लिए {braces} के बीच की संख्या प्राप्त कर सकते हैं तो उस नंबर पर _crtBreakAlloc सेट करें। –

उत्तर

7

ऐसा लगता है कि रिसाव की रेखा केवल तब प्रदर्शित होती है जब सीआरपी फ़ाइल में सीआरटी चालू हो।

+4

क्या बिना फ़ाइलों के सीआरटी को चालू करने का कोई त्वरित तरीका है, उदा। इसमें एक नया शीर्षलेख बनाना जिसमें इसे परिभाषित किया गया है और इसमें हर जगह शामिल है? – aquirdturtle

+0

सेकेंडिंग एक्वार्डटर्टल का प्रश्न: ऐसा लगता है कि मेरे सॉफ़्टवेयर में सभी कोड "stdafx.h" शामिल हैं, इसलिए मैंने "TODO" टिप्पणी के बाद इन तीन पंक्तियों को जोड़ा, और पुनर्निर्मित किया। यह पर्याप्त नहीं था। '// TODO: संदर्भ अतिरिक्त हेडर अपने कार्यक्रम here' की आवश्यकता है ' #define _CRTDBG_MAP_ALLOC' '# शामिल ' ' # शामिल ' –

8

मेरे मामले में मैंने this थ्रेड से मेरे कोड में सामान शामिल किया। यह new ऑपरेटर को ओवरराइड करता है और बाद में प्रिंटिंग के लिए फ़ाइल का नाम और लाइन नंबर शामिल करता है। सुनिश्चित नहीं है कि यह केवल विजुअल स्टूडियो पर लागू है।

#define _CRTDBG_MAP_ALLOC 
#include <crtdbg.h> 
#ifdef _DEBUG 
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) 
#define new DEBUG_NEW 
#endif 

संदर्भित स्रोत से पूरे परीक्षण कोड है:

#define _CRTDBG_MAP_ALLOC 
#include<iostream> 
#include <crtdbg.h> 
#ifdef _DEBUG 
    #define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) 
    #define new DEBUG_NEW 
#endif 

int main() 
{ 
    char *a = new char[10]; 
    _CrtDumpMemoryLeaks(); 
    return 0; 
} 

जो मेरे परीक्षण का मामला प्रिंट में:

Detected memory leaks! 
Dumping objects -> 
e:\test\testapplication\testapplication.cpp(11) : {144} normal block at 0x007F4EF0, 10 bytes long. 
Data: <   > CD CD CD CD CD CD CD CD CD CD 
Object dump complete. 
संबंधित मुद्दे