2010-07-08 10 views
16

मैं विजुअल स्टूडियो 2010 में एसडीएल के साथ एक गेम पर काम नहीं कर रहा हूं। मैं _CrtDumpMemoryLeaks() मैक्रो में आया और सोचा कि मैं इसे जाने दूंगा। _CrtDumpMemoryLeaks() को आमंत्रित करने से आउटपुट विंडो में प्रिंट मेमोरी लीक होती है, लेकिन यह नहीं दिखाती कि यह कहां होता है।सी ++ - _CrtDumpMemoryLeaks() के साथ मेमोरी लीक परीक्षण - आउटपुट लाइन संख्या

मैंने एमएसडीएन आलेख को Memory Leak Detection Enabling पर पढ़ा है, और यह बताता है कि यदि मैं _CRTDBG_MAP_ALLOC को परिभाषित करता हूं तो इसे अपमानजनक कथन की लाइन संख्या आउटपुट करनी चाहिए। यह मेरे मामले में नहीं होता है। (हालांकि मैं इसे काम करने में सक्षम था अगर मैं सीधे malloc() का उपयोग करता हूं - 'नया' का उपयोग करके नहीं)।

कोड:

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

int main(int argc, char *argv[]) { 
    int *var = new int(5); 

    _CrtDumpMemoryLeaks(); 

    return 0; 
} 

उत्पादन होता है निम्नलिखित: जब 'नए' तो अन्य तरीकों से समान व्यवहार को प्राप्त करने के लिए सुझाव का उपयोग कर आवंटन की सराहना की

 
Detected memory leaks! 
Dumping objects -> 
{58} normal block at 0x007D1510, 4 bytes long. 
Data: < > 05 00 00 00 
Object dump complete. 

If _CrtDumpMemoryLeaks() उत्पादन लाइन नंबर करने में असमर्थ है।

उत्तर

9

जब आप _DEBUG को परिभाषित करने और <crtdbg.h> शामिल आप एक ओवरलोड operator new जो अतिरिक्त पैरामीटर जो आप new भाव नियुक्ति में फ़ाइल और लाइन नंबर निर्दिष्ट करने के लिए उपयोग कर सकते हैं लेता है मिलता है।

उदा।

int* p = new (_NORMAL_BLOCK, __FILE__, __LINE__) int(5); 

आप इसे एक सशर्त परिभाषित मैक्रो में लपेट सकते हैं, उदा।

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

int* p = new DEBUG_NEW_PLACEMENT int(5); 

आप लोगों को परिभाषित देख पा रहे हैं जबकि एक मैक्रो new पूरी तरह से इस फार्म क्लाइंट कोड को छिपाने के लिए, मैं व्यक्तिगत रूप से इसकी सलाह नहीं देते, क्योंकि यह कुछ भी टूट जाता है पहले से ही जानबूझकर नियुक्ति नए का उपयोग करने और आप यह सुनिश्चित करें कि देने का उपयोग करने के लिए किसी भी हेडर करना है new को फिर से परिभाषित करने वाले किसी भी शीर्षलेख से पहले नया (जैसे कई मानक शीर्षलेख) शामिल किए गए हैं। इससे 'समायोजित' किए बिना हेडर फाइलों में new के कुछ इनलाइन उपयोगों को छोड़ना आसान हो सकता है।

3

आप इन परिभाषित करता है की आवश्यकता हो सकती अपने


#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
+0

यह एमएफसी केवल – humbagumba

+1

नहीं है, यह एमएफसी के बिना पूरी तरह से ठीक काम करता है। – msteiger

+7

सबसे पहले, यह नया परिभाषित करता है जो थोड़ा भयानक है और किसी मौजूदा प्लेसमेंट को नए उपयोगों को तोड़ देता है; दूसरी बात यह 'DEBUG_NEW' के लिए एक वैध परिभाषा की आवश्यकता है जो केवल' afx.h' में मानक वीसी इंस्टॉल में प्रदान की जाती है जो कि एमएफसी हेडर बहुत अधिक है। –

8

दृश्य रिसाव डिटेक्टर के एक पुराने संस्करण है कि शामिल है के बाद।

इस प्रयास करें: http://vld.codeplex.com/

+0

इसे इंगित करने के लिए धन्यवाद। मैं तुम्हारा जवाब आपके पक्ष में हटा देता हूं। साथ ही, आपको टिप्पणी के बजाए अपने उत्तर को वास्तविक उत्तर की तरह लिखना चाहिए। –

+0

वीएलडी के नए संस्करण ने विज्ञापन के रूप में काम किया और कॉल स्टेक्स और लाइन नंबरों के साथ पूर्ण, छोटी मेमोरी लीक का एक गुच्छा खोजने में मदद की। हुर्रे। –

2

चार्ल्स बेली द्वारा स्वीकृत उत्तर की आवश्यकता है कि आप अपना स्रोत कोड बदल दें और यह आवश्यक नहीं है। यदि आप new और delete (या सरणी संस्करण) का उपयोग कर रहे हैं, तो आपको बस अपनी प्रत्येक परियोजनाओं (किसी स्थिर या गतिशील पुस्तकालय निर्भरताओं सहित) की stdafx.h फ़ाइल में इस कोड स्निपेट को रखना होगा, और फिर यह एक स्रोत देगा प्रत्येक लीक स्मृति वस्तु से जुड़ी फाइल और लाइन नंबर:

#ifdef _DEBUG 
    #ifndef DBG_NEW 
     #define DBG_NEW new (_NORMAL_BLOCK , __FILE__ , __LINE__) 
     #define new DBG_NEW 
    #endif 
#endif // _DEBUG 

यह माइक्रोसॉफ्ट के webpage मामले पर से सीधे आता है।

संबंधित मुद्दे