2011-12-17 13 views
9

मेरे wxwidgets अनुप्रयोग में, डीबग मोड में चलते समय मुझे यह संदेश विजुअल स्टूडियो 2010 के आउटपुट में मिला। आवेदन ठीक चला गया, और मैंने इसे बंद करने के बाद ही देखा।पता लगाया गया स्मृति लीक

पता लगाया स्मृति मेमोरी!

डम्पिंग वस्तुओं ->

{9554} 0x003CDCC0 पर सामान्य ब्लॉक, 44 बाइट्स लंबे।
डाटा: < ई एन डी> 20 सी 1 65 01 01 00 00 00 6E 00 00 00 9 सीई 64 01

{9553} 0x003CDB58 पर सामान्य ब्लॉक, 8 बाइट्स लंबे।

डाटा: < डी ई <> 44 BD 65 01 C0 डीसी -3 सी 00
{9552} सामान्य 0x003CDC50, 48 बाइट्स लंबे पर ब्लॉक।

डाटा: < ई> A0 95 65 01 01 00 00 00 19 00 00 00 19 00 00 00

वस्तु डंप पूरा।

मेरे कार्यक्रम में मैं स्पष्ट रूप से स्मृति आवंटित नहीं कर रहा हूं, हालांकि WxWidgets ढांचा है। मुझे पहली बार ऐसा संदेश मिला है, और इसके सटीक कारण को नहीं पता है।

मैं इस मेमोरी रिसाव से कैसे छुटकारा पा सकता हूं?

+1

पोस्ट अपने कोड, अधिमानतः एक न्यूनतम कार्यक्रम का आवंटन किया गया है जो समस्या को पुन: उत्पन्न करता है। – user1071136

+0

दुर्भाग्य से मैं एक न्यूनतम कार्यक्रम पोस्ट नहीं कर सकता। क्योंकि, यह कई फाइलों के साथ एक जीयूआई प्रोग्राम है, और एक जीयूआई ढांचा है। मुझे नहीं पता कि इसका क्या कारण है। क्योंकि मैंने कहीं भी 'नया' या 'मॉलोक' का उपयोग नहीं किया है। –

+0

मुझे डर है कि आप उत्तर से अधिक अनुमान प्राप्त करने जा रहे हैं :) – user1071136

उत्तर

24

आपको बस अपने मुख्य कार्य की शुरुआत में निम्नलिखित पंक्तियां जोड़नी होंगी। इस ध्वज को जोड़कर, विजुअल स्टूडियो उस लाइन पर टूट जाएगा जो स्मृति रिसाव बना रहा है।

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
    _CrtSetBreakAlloc(9554); 
    _CrtSetBreakAlloc(9553); 
    _CrtSetBreakAlloc(9552); 

करें कि आप सही वस्तु सामान्य ब्लॉक पता है क्योंकि वे बदल सकते हैं और सुनिश्चित करें कि आप _DEBUG पर संकलन कर रहे हैं हो सकता है बनाओ।

यह भी देखें: _CrtSetDbgFlag और _CrtSetBreakAlloc एमएसडीएन संदर्भ।

+1

धन्यवाद, मेरे लिए वास्तव में क्या काम किया गया था '_crtBreakAlloc = 9609;' पहले ही कथन के रूप में। WxWidgets के लिए मुझे इसे मुख्य एप्लिकेशन के 'ऑनइनिट()' फ़ंक्शन में जोड़ना पड़ा। –

+2

हाय, आप 960 9 के साथ कैसे आए? –

0

हो सकता है कि कुछ प्रकार के स्थैतिक उदाहरण अभी भी ढांचे द्वारा आवंटित किए जाएं। "Devpartner" जैसे प्रोफाइलर के साथ इसे हल करने का प्रयास करें।

+0

क्या विजुअल स्टूडियो का संदेश कुछ मदद प्राप्त करने के लिए उपयोग किया जा सकता है? –

+0

@ विनायकगर्ग मदद कर सकते हैं, लेकिन बहुत सीमित उपयोग के लिए। सूचीबद्ध 'डेटा' वास्तव में स्मृति पते की सामग्री है, जिसके द्वारा आप अनुमान लगा सकते हैं कि स्मृति का उपयोग किस प्रकार किया जाता है, और अनुमान लगाया जाता है कि यह कहां आवंटित किया गया है। – fefe

+0

वह खिड़कियों का उपयोग कर रहा है, इसलिए वालग्रिंड यहां काम नहीं करेगा। –

0
  1. कभी भी 'मान लें' कि आपका कोड स्मृति रिसाव प्रमाण है। जब तक कि आप प्रोग्रामिंग डेमी-देवताओं में से एक नहीं हैं, कोई भी स्मृति मेमोरी लीक लिखने से प्रतिरक्षा नहीं है।

  2. आप स्मृति रिसाव की पहचान करने के लिए सीमा शुल्क (माइक्रोफोकस से) जैसे टूल का उपयोग कर सकते हैं क्योंकि यह आपको कॉलस्टैक देगा। डीबग सीआरटी से मिली मेमोरी रिसाव रिपोर्ट आपको केवल एक विशेष पते पर लीक की गई मेमोरी बताती है। सीमा शुल्क परीक्षक जैसे उत्पाद आपको कई अन्य उपहारों के साथ उस स्मृति रिसाव के लिए कॉलस्टैक देंगे। बाजार में अन्य मेमोरी रिसाव उपकरण हैं, लेकिन मैं उन्हें यहां सूचीबद्ध करने का प्रयास नहीं करूंगा।

  3. यदि आप सुनिश्चित हैं कि स्मृति रिसाव 'wxwidgets' के कारण है, तो शायद आपको उस लाइब्रेरी के लेखकों को सूचित करना चाहिए और शायद वे इसे ठीक कर देंगे (उपयुक्त रेपो चरणों के साथ)।

+1

मैंने कभी नहीं कहा कि मेरा कोड मेमोरी लीक सबूत है, बस मैंने अपने कोड में नया या मॉलोक इस्तेमाल नहीं किया है। हाँ शायद मुझे इसे wxwidgets साइट पर पूछने का प्रयास करना चाहिए। –

0

This wiki हर स्रोत फ़ाइल आपके पास करने के लिए निम्न जोड़ने पता चलता है, के बाद अन्य सभी हेडर की शामिल हैं:

#ifdef __WXMSW__ 
    #include <wx/msw/msvcrt.h>  // redefines the new() operator 
#endif 

यह परिणाम होगा लीक की रिपोर्ट में किया जा रहा है जब आपके कार्यक्रम समाप्त होता है।

अधिक विशेष रूप से, सुनिश्चित करें कि आप का उपयोग करके बनाए गए सभी ऑब्जेक्ट्स पर ->Destroy() पर कॉल करें (शायद आपकी शीर्ष विंडो को छोड़कर)।

0

रिसाव बनाम द्वारा रिपोर्ट के स्थान में ही है, तो हर बार जब आप को देखने के लिए एक databreakpoint सेट कर सकते हैं जब यह स्मृति बदला जा रहा है और उम्मीद है कि यह पता लगाने जो इस स्मृति

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