कई उत्तरों का उल्लेख है कि डिबगिंग में सहायता के लिए डेबग बिल्ड में ऐसा करना उचित हो सकता है।
इस मत करो।
आप संभावित रूप से एक डिबग बिल्ड में किसी समस्या को छिपाने में मदद करेंगे जो आपके रिलीज में छिपा हुआ नहीं है, जिससे आप वास्तव में ग्राहकों को देते हैं (जो आपके डीबग बिल्ड के विपरीत प्रभाव है)।
यदि आप डाटर में पॉइंटर को 'साफ़' करने जा रहे हैं, तो एक अलग मुहावरे बेहतर होगा - पॉइंटर को पर ज्ञात खराब सूचक मूल्य पर सेट करें। इस तरह यदि ऑब्जेक्ट के लिए कोई हानिकारक संदर्भ है जो आखिरकार पॉइंटर का उपयोग करने का प्रयास करता है, तो आपको पॉइंटर के उपयोग से बचने वाले बग्गी कोड के बजाय एक निदान योग्य क्रैश मिलेगा क्योंकि यह नोटिस करता है कि यह शून्य है।
कहो कि doSomething()
की तरह देखा:
void doSomething()
{
if (bar) bar->doSomething();
}
फिर bar
शून्य करने के लिए सिर्फ एक बग को छिपाने अगर वहाँ एक नष्ट कर दिया Foo
उद्देश्य यह है कि Foo::doSomething()
कहा जाता है के लिए एक झूलने संदर्भ था मदद की है की स्थापना।
यदि आपका सूचक साफ अप की तरह देखा:
~Foo()
{
delete bar;
if (DEBUG) bar = (bar_type*)(long_ptr)(0xDEADBEEF);
}
आप (हालांकि अभी bar
अकेला छोड़ने शायद ऐसा ही प्रभाव होता है) बग को पकड़ने का एक बेहतर मौका हो सकता है।
अब अगर कुछ भी Foo
उद्देश्य यह है कि हटाई गई सामग्री के लिए एक झूलने संदर्भ है, bar
के किसी भी उपयोग यह एक शून्य की जांच की वजह से संदर्भित से बचने नहीं होगा - यह खुशी से सूचक का उपयोग करने की कोशिश करेंगे और आप एक दुर्घटना मिलेगा कि आप डिबग बिल्ड में कुछ भी खराब होने के बजाय ठीक कर सकते हैं, लेकिन आपके ग्राहक के रिलीज बिल्ड में अभी भी लटकने वाले संदर्भ (बीमार प्रभाव के लिए) उपयोग किया जा रहा है।
जब आप डीबग मोड में संकलित कर रहे हैं, तो संभावना बहुत अच्छी है कि डीबग हीप मैनेजर पहले से ही आपके लिए यह कर रहा है (कम से कम एमएसवीसी के डीबग रनटाइम हीप मैनेजर स्मृति को इंगित करने के लिए 0xDD के साथ मुक्त स्मृति को ओवरराइट करेगा मृत/मुक्त कर दिया)।
मुख्य बात यह है कि यदि आप कक्षा के सदस्यों के रूप में कच्चे पॉइंटर्स का उपयोग कर रहे हैं, तो डॉटर चलाने पर पॉइंटर्स को न्यूल पर सेट न करें।
यह नियम अन्य कच्चे पॉइंटर्स पर भी लागू हो सकता है, लेकिन यह इस बात पर निर्भर करता है कि पॉइंटर का उपयोग कैसे किया जाता है।
संभवतः आपके पास कोई 'getBar() 'विधि नहीं है ... – Skilldrick
एक बेहतर सवाल यह है कि आपके कोड में कच्चा सूचक क्यों है। – GManNickG
अधिक महत्वपूर्ण; जब आपकी कक्षा आवंटित स्मृति से संबंधित होती है तो एक आकलन ऑपरेटर और एक कॉपी-कन्स्ट्रक्टर प्रदान करें। –