2011-11-04 10 views
6

संभव डुप्लिकेट हटाना:
Is there any reason to check for a NULL pointer before deleting?एक अशक्त सूचक

मैं अक्सर कोड में निम्न देखें:

if(pointer) 
    delete pointer; 
मेरी समझ के लिए

यह एक अशक्त हटाना सुरक्षित है सूचक, तो इस चेक का मुद्दा क्या है?

+2

..... क्या यह सुरक्षित है? – slartibartfast

+3

याद रखने के लिए महत्वपूर्ण बिंदु इसे एक बार हटाए जाने के बाद सेट करें। – vrrathod

+1

मेरी समझ के लिए, आपकी समझ सही है लेकिन सभी लोग इसे साझा नहीं करते हैं। लेकिन देखते हैं कि भाषा परत क्या कहती है। – delnan

उत्तर

9

delete जांच करेगा कि क्या सूचक आपके लिए नल है, तो आप सही हैं कि चेक की आवश्यकता नहीं है।

आप हो सकता है यह भी देखना है कि कुछ लोगों के बाद सूचक शून्य पर सेट ताकि आप तुम्हारा है कि अब कुछ भी की तरह कोशिश करते हैं और उपयोग करने स्मृति बेवकूफ करते हैं या, सूचक दो बार को हटाने से रोक नहीं है हटाए जाने पर जो एक त्रुटि का कारण होगा।

+0

आपकी टिप्पणी के लिए "ताकि आप कुछ भी बेवकूफ न करें जैसे कि कोशिश करें और स्मृति का उपयोग करें जो अब आपका नहीं है", यहां तक ​​कि एक शून्य सूचक को भी संदर्भित करना एक यूबी है। यह तब उपयोगी होता है जब सूचक को फिर से हटा दिया जाता है (डबल विलोपन जिसे आपने पहले ही उल्लेख किया है) –

1

हालांकि यह अभी सुरक्षित है, यह हमेशा नहीं था :-) तो यह संभवतः आदत है। हटाने के अन्य परिणाम भी हैं। 1) यदि आप एक विशेष मेमोरी मैनेजर का उपयोग कर रहे हैं और नए ओवरराइड कर रहे हैं और ऑपरेटर हटाते हैं, तो आपको अधिक जानकारी के लिए Operator Delete चेक करना होगा

+6

'[उद्धरण वांछित]'। यह जोड़ने के लिए एक बहुत ही आसान बात है, और आईआईआरसी सी ने गारंटी दी है कि 'फ्री' हमेशा के लिए सही ढंग से 'NULL' हैंडल करता है (कम से कम C89, अगर यह एएनएसआई सी में भी होता तो मुझे आश्चर्य नहीं होगा)। इसलिए मुझे यह विश्वास करना मुश्किल लगता है कि कभी भी उपयोग करने योग्य सी ++ कार्यान्वयन था जो 'हटाएं नल' को संभाल नहीं सकता था। – delnan

1

चेक आवश्यक नहीं है।

The documentation राज्यों हटा भी है कि "स्मृति ptr द्वारा बताया ब्लॉक पुनःआवंटन (रिक्त नहीं करता है, तो)"

0

ज्यादातर लोग ऐसा करते हैं क्योंकि वे आम तौर त्रुटि अन्यथा (अन्य की तुलना में है कि मैं वास्तव में नहीं दिख रहा है से निपटने के लिए है चेक करने का मुद्दा)। कुछ मामलों में वे यह जांचने के लिए करते हैं कि वे कुछ मुक्त कर रहे हैं और गलती से कहीं भी एक सूचक को बदल नहीं रहे हैं और इसे मुक्त नहीं करके स्मृति रिसाव का कारण बन रहे हैं। free(NULL); सभी मामलों में काम करना चाहिए और त्रुटि से बाहर नहीं होना चाहिए, जब तक कि त्रुटि प्रबंधन में शामिल न हो, आप if स्टेटमेंट को हटा सकते हैं और बस मुफ्त में कर सकते हैं।

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

  • कोई संबंधित समस्या नहीं^_^