2012-05-26 12 views
6

जब मैं किसी और के कोड को डीबग करता हूं, तो मुझे पॉइंटर कब हटाया जा सकता है?एक पॉइंटर हटाए जाने पर कैसे जांचें?

+11

सरल: आप नहीं कर सकते। –

+3

यह एक सूचक नहीं है जो हटा दिया गया है, यह स्मृति क्षेत्र (या डेटा ऑब्जेक्ट) है जो उस पॉइंटर द्वारा इंगित किया जाता है। हालांकि, यह भी देखें http://valgrind.org/ –

+0

सामान्य मामले में, आप नहीं कर सकते हैं, हालांकि वालग्रिंड/शुद्ध/बीमा ++ जैसे टूल कुछ मामलों में डबल डिलीट और लीक जैसी बग ढूंढने में आपकी सहायता कर सकते हैं। –

उत्तर

5

1)

डीबगर का उपयोग करें। एक हटाएं का पालन करें। सामान्य तौर पर आप कुछ "मुक्त" समारोह में समाप्त एक सूचक

हालत पिछले सूचक अपने जांच की सूचक

2)

एक समान दृष्टिकोण जितना समान मान है कि के साथ एक ब्रेकपाइंट सेट गुजर "हटाएं" विधि को ओवरराइड करना है और उस पॉइंटर को प्रश्न में जांचना है।

3)

सूचक एक नाशक के साथ एक वस्तु को संदर्भित करता है। विनाशक पर एक ब्रेकपॉइंट रखें। हो सकता है कि आप पहले एक विनाशक (यदि संभव हो तो विदेशी कोड द्वारा, संभवतः अपने कोड पर संभव हो)

+0

आपके उत्तर के लिए धन्यवाद। मैं आपकी टिप्पणियों को समझने की कोशिश करूंगा। लेकिन मेरा सी ++ प्रोग्रामिंग अनुभव "हैलो वर्ल्ड" तक ही सीमित है। मुझे आशा है कि मुझे 2-3 दिनों में अपना काम करने के लिए एक आसान समाधान मिल सकता है। मैं main.cpp में एक पॉइंटर के लिए 'डिलीट' कमांड को टिप्पणी करता हूं जहां इसे 'char * foo = "" कोड के रूप में परिभाषित किया जाता है और सेगमेंट गलती के बिना। लेकिन मुझे उम्मीद है कि क्यों। –

+0

'char * foo = "" जैसे स्थिर द्वारा बनाए गए पॉइंटर ** को ** हटाएं ** का उपयोग नहीं करना चाहिए। ** ** ** ** केवल ** हटाएं जब ऑब्जेक्ट एक ** नया ** –

0

GDB watchpoint के बारे में कैसे हो सकता है? आप प्रश्न में पॉइंटर पर एक वॉचपॉइंट सेट कर सकते हैं और देख सकते हैं कि प्रोग्राम इसके संदर्भ को हटाने के लिए कब उपयोग करता है।

+0

द्वारा बनाया गया है, कोई सामग्री जरूरी नहीं बदलेगी ... –

+0

कई आर्किटेक्चर पढ़ने के दृष्टिकोण को समर्थन देते हैं। क्या आप पॉइंटर पर एक पठित दृष्टिकोण नहीं लगा सकते? –

0

यदि आप किसी सूचक द्वारा इंगित स्मृति की जिक्र कर रहे हैं, तो आप नहीं कर सकते। हालांकि, अगर आपको dangling पॉइंटर्स के साथ समस्या हो रही है, तो बस अपने सभी कच्चे पॉइंटर्स को boost :: shared_ptr के साथ प्रतिस्थापित करें और सभी अवसरों को मुक्त और हटाएं। कभी भी हटाएं या मुफ्त कीवर्ड का उपयोग न करें। स्मार्ट पॉइंटर्स रॉक!

+0

मैंने लोगों को यह कहते हुए देखा है कि साझा पॉइंटर्स के लिए कच्चे पॉइंटर्स को स्वैप करना उतना ही आसान है, लेकिन यह सच नहीं है। साझा सूचक प्रतियां धीमी हैं! यदि आप उनका उपयोग करते हैं तो आपको यह सुनिश्चित करने की ज़रूरत है कि जब भी संभव हो, संदर्भ द्वारा पास का उपयोग करके आप जितनी संभव हो उतनी प्रतियां बना सकते हैं। –

+0

@ChrisHayden: अधिकांश लोगों को साझा पॉइंटर्स की आवश्यकता नहीं है। अद्वितीय पॉइंटर्स ठीक हैं। – Puppy

-1

आप नहीं कर सकते। स्मार्ट पॉइंटर्स का प्रयोग करें और इसके बारे में कभी चिंता न करें।

+2

केवल तभी यदि आपके पास टाइम मशीन है ताकि आप स्मार्ट पॉइंटर्स के साथ कोड लिखने के लिए 'किसी और को' बता सकें। वास्तविक दुनिया प्रोग्रामिंग के अधिकांश मौजूदा कोड के साथ कुछ काम है। –

+4

या ... समस्याग्रस्त कोड को पुनः प्रतिक्रिया दें। जब आप पुरानी बुरी कोड से स्मृति त्रुटियों की अनंतता को शिकार करते हैं तो शिकार करना बेहतर होगा, ताकि वे ऐसा नहीं कर सकें ताकि वे न हों। यहां तक ​​कि यदि आप बहुत अधिक प्रयासों के बाद सभी बग को खत्म करने में सफल होते हैं, तो भी आप लोगों को नए परिचय देने से नहीं रोक सकते हैं। एकमात्र सामान्य समाधान रिफैक्टर है। – Puppy

+0

मैं एएसआईसी डिजाइनर हूं, मेरी "हैलो वर्ल्ड" अनुभव मुझे 5 साल के कोड को फिर से लिखने में मदद नहीं कर सकता है। –

3

प्रश्न के प्रकार के विनाशक पर एक सशर्त ब्रेकपॉइंट सेट करें। । हालत, वस्तु आप जैसे में रुचि रखते हैं करने के लिए है कि this अंक हो विजुअल C++ एक्सप्रेस 2010 में करते हैं:

enter image description here

ऊपर चित्र मैं पहले तीन new भाव के बाद करने के लिए मार डाला के लिए, तो ध्यान दिया b ऑब्जेक्ट का पता, और उसके बाद ब्रेकपॉइंट स्थिति के रूप में उपयोग किया गया कि this वह पता होना चाहिए।

विवरण अन्य डिबगर्स के साथ ऐसा करने के तरीके के बारे में डीबगर पर निर्भर करता है। डीबगर के मैनुअल देखें।

+0

आपके उत्तर के लिए धन्यवाद। लेकिन मैं लिनक्स पर काम कर रहा हूं, और सी ++ कोड संकलित और मेकफ़ाइल द्वारा निष्पादित किया गया है। कोड में कोई कन्स्ट्रक्टर/विनाशक नहीं है। सूचक को 'char * foo =" "' के रूप में परिभाषित किया गया है और हटाएं [] foo' के रूप में हटा दिया गया है। हटाए गए लाइन की टिप्पणियां, सबकुछ ठीक दिखता है। तो मुझे कोड में खोजने की उम्मीद है जहां पॉइंटर फू हटा दिया गया है। –

+0

यदि आप अब जो कह रहे हैं वह सही है, तो प्रश्न में सूचक एक शाब्दिक स्ट्रिंग को इंगित करता है, फिर हटाए गए [हटाएं]] * समस्या * थी। एक नलपॉइंटर के 'डिलीट' को छोड़कर यह यूबी को '[]' हटाए जाने वाले पॉइंटर को 'नया []' प्राप्त नहीं किया गया है। मुझे संदेह है कि, जो भी आप कह रहे हैं वह पूरी तरह से सही नहीं है, और उस स्थिति में, डीबगिंग के बजाय, 'std :: string' का उपयोग करें। –

1

सी ++ में आपके पास कोई इनबिल्ट क्रॉस प्लेटफ़ॉर्म सुविधा नहीं है, जो यह पता लगाएगी कि कोई सूचक हटा दिया गया है या नहीं।

हालांकि, आप कुछ डिबगर्स, टूल और भाषा द्वारा प्रदान की गई सुविधाओं का उपयोग कर सकते हैं। उदाहरण के लिए आप new और delete ऑपरेटर को विश्व स्तर पर और/या प्रति वर्ग अड्डों पर अधिभारित कर सकते हैं और एक सामान्य सेट/मानचित्र प्रकार का संदर्भ बनाए रख सकते हैं। उदा .:

class X { 
    ... 
    set<void*> m_CurrentAlloc; 

public: 
    void* operator new (size_t SIZE) 
    { 
    ... 
    m_CurrentAlloc.insert(p); 
    return p; 
    } 

    void operator delete (void *p) 
    { 
    m_CurrentAlloc.erase(p); 
    ... 
    } 
}; 

आवधिक आधार पर या कार्यक्रम इस set की सामग्री को मुद्रित या सत्यापित किया जा सकता के अंत में।
याद रखें कि यह एक आदर्श स्थिति का समाधान है, जहां आप new/delete का उपयोग कर मेमोरी प्रबंधन कर रहे हैं। यदि आपके पास malloc/free का मिश्रण भी है तो कोड को अन्य संवर्द्धन की भी आवश्यकता है।