खोजने के लिए एप्लिकेशन सत्यापनकर्ता का उपयोग कैसे करें मैं मानक उपयोगिताओं का उपयोग कर अपने आवेदन में मेमोरी लीक ढूंढना चाहता हूं। पहले मैंने अपनी खुद की मेमोरी आवंटक का उपयोग किया था, लेकिन अन्य लोगों (हाँ, आप एलियनफ्लिड) ने माइक्रोसॉफ्ट के एप्लिकेशन सत्यापनकर्ता का उपयोग करने का सुझाव दिया, लेकिन मुझे लगता है कि मैं इसे अपने रिसाव की रिपोर्ट नहीं कर सकता।मेमोरी लीक
#include <iostream>
#include <conio.h>
class X
{
public:
X::X() : m_value(123) {}
private:
int m_value;
};
void main()
{
X *p1 = 0;
X *p2 = 0;
X *p3 = 0;
p1 = new X();
p2 = new X();
p3 = new X();
delete p1;
delete p3;
}
यह परीक्षण स्पष्ट रूप से एक स्मृति रिसाव होता है: p2 new'd है लेकिन उसे हटाया नहीं मैं निम्नलिखित सरल आवेदन किया है।
मैं निम्नलिखित कमांड लाइन का उपयोग कर निष्पादन का निर्माण:
cl /c /EHsc /Zi /Od /MDd test.cpp
link /debug test.obj
मैं आवेदन सत्यापनकर्ता डाउनलोड किया गया (4.0.0665) और सभी चेक सक्षम होना चाहिए।
यदि अब मैं अपना टेस्ट एप्लिकेशन चलाता हूं तो मैं एप्लिकेशन सत्यापनकर्ता में इसका एक लॉग देख सकता हूं, लेकिन मुझे मेमोरी रिसाव दिखाई नहीं दे रहा है।
सवाल:
- क्यों नहीं आवेदन सत्यापनकर्ता एक रिसाव रिपोर्ट करता है?
- या आवेदन सत्यापनकर्ता वास्तव में लीक खोजने का इरादा नहीं है?
- यदि यह नहीं है कि आवेदन के अंत में स्पष्ट रूप से लीक की रिपोर्ट करने के लिए कौन से अन्य उपकरण उपलब्ध हैं (यानी नियमित स्नैपशॉट नहीं लेना और उन्हें तुलना करना क्योंकि यह 1 जीबी या उससे अधिक के आवेदन में संभव नहीं है), कॉल सहित आवंटन के स्थान के ढेर (ऐसा नहीं सीआरटी के अंत में सरल रिसाव रिपोर्टिंग)
मैं एक सभ्य उपयोगिता नहीं मिल रहा है, तो मैं अभी भी अपने स्वयं के स्मृति प्रबंधक का सहारा लेना पड़ (जो यह करता है पूरी तरह से)।
// debug_new.h #pragma once #include "crtdbg.h" #ifdef _DEBUG #ifndef DEBUG_NEW #define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) #endif #endif
सभी सीपीपी फ़ाइलें:
#include "debug_new.h" ... // After all other include lines: #ifdef _DEBUG #define new DEBUG_NEW #endif ...
लिखें कार्यक्रम प्रवर्तन कोड में इस बार:
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
में
इस तरह के औजारों में यह समस्या है - हम जो कुछ भी वास्तव में चाहते हैं उसे छोड़कर वे सब कुछ करते हैं ... क्या सीआरटी मेमोरी आपके लिए ठीक है, कोड में आवंटन स्थान सहित, लेकिन कॉल स्टैक के बिना? इस मामले में आपको केवल नए ऑपरेटर को फिर से परिभाषित करने और मेमोरी लीक डंप चालू करने की आवश्यकता है। –
समस्या यह है कि मेरे पास एक पूरी तरह से काम कर रहा है, स्वयं लिखित, स्मृति आवंटक जो काफी तेज़ है, एप्लिकेशन के अंत में कॉल स्टैक, रिपोर्ट लीक (कॉल स्टैक समेत) सहित सभी मेमोरी आवंटन लॉग करता है, बफर ओवरफ़्लो/अंडरफ्लो के लिए चेक करता है। .., लेकिन हर कोई (स्टैक ओवरव्लो पर) इंगित करता है कि आपको अपना खुद का मेमोरी मैनेजर नहीं लिखना चाहिए क्योंकि सीआरटी/विंडोज के मानक एक के लिए पर्याप्त है, और मेमोरी लीक, ओवरराइट्स, ... खोजने के लिए पर्याप्त उपयोगिताएं हैं ... हालांकि, मैं उन्हें काम नहीं कर पा रहा हूं। – Patrick
मुझे यह भी लगता है कि मेमोरी लीक डिटेक्शन आपके स्वयं के मेमोरी आवंटक को लिखने का कारण नहीं है। सीआरटी स्टैक ट्रेस को छोड़कर सब कुछ देता है - यदि आप दिलचस्प हैं, तो मैं आपको कोड पोस्ट कर सकता हूं। –