2012-04-23 12 views
14
// Destructor. If there is a C object, delete it. 
// We don't need to test ptr_ == NULL because C++ does that for us 

    ~scoped_ptr() { 
     enum { type_must_be_complete = sizeof(C) }; 
     delete ptr_; 
    } 

नोट: सी टेम्पलेट पैरामीटरविनाशक के लिए यह enum क्या है?

मैं जानता हूँ कि हम नहीं कर सकते एक अशक्त सूचक को हटाना है, एक अपवाद बढ़ा दी जाएगी। इसलिए इस मामले में, enum परिभाषा को रोकने के लिए कुछ करना चाहिए। उत्पादन में, कभी-कभी हम एक प्रोग्राम को सरल नहीं करना चाहते हैं क्योंकि हमारे पास शून्य सूचक है, हम वैकल्पिक परिदृश्य को देखना चाहेंगे, जब सूचक शून्य हो। और इस कोड का उत्पादन लगभग हर जगह उत्पादन में किया जाता है?

धन्यवाद दोस्तों।

+7

हम एक नल पॉइंटर यह पूरी तरह ऐसा करने के लिए मान्य है हटा सकते हैं। –

+0

मुझे लगता है कि मेरी समस्या पॉइंटर्स के डबल हटाने के साथ उलझन में थी। संकलक द्वारा डबल विलोपन का पता लगाया जाता है जब यह हमेशा एक अपवाद उठाता है। तो एक शून्य सूचक और डबल हटाने के बीच क्या अंतर है? – maress

+2

@maress: आप जितनी बार चाहें उतनी बार एक नल पॉइंटर को "हटाएं" कर सकते हैं (या वास्तव में, आप इसे हटाने का प्रयास कर सकते हैं, रनटाइम शून्य सूचक का पता लगाएगा और कुछ भी नहीं करेगा) – rjnilsson

उत्तर

17

यह प्रभावी ढंग से हटाने के लिए एक स्थिर दावा है। कार्यान्वयन यह जानना चाहता है कि क्या यह किसी ऐसे प्रकार से निपट रहा है जिसकी घोषणा आगे की घोषणा के बजाय परिवर्तनीय को हटाने से पहले दिखाई दे रही है।

आपका संकलक एक त्रुटि उत्सर्जित करेगा जब आप इसे एक अधूरी प्रकार के आकार से पूछते हैं:

struct S; 
enum { Size = sizeof(S) }; 

अद्यतन

अपने संकलक और माथीउ एम आपको बता देंगे के रूप में - delete -ing एक अधूरा प्रकार अपरिभाषित है।

+1

'sizeof (* ptr_)' का उपयोग क्यों नहीं करें? – sharptooth

+2

@ शार्पूटोथ: मैं तर्क दूंगा कि 'सी' स्पष्ट है, और यह भी टाइप करने में तेज़ है :) –

+5

@ जस्टिन: यह एक सटीक मूल्य के लिए एक सूचक को 'हटाने' का प्रयास करने के लिए सटीक होगा कि यह अनिश्चित व्यवहार है * *, यही कारण है कि यह निदान के लायक है। बूस्ट में भी उसी प्रभाव के लिए 'check_delete' है, वे इसका पुन: उपयोग कर सकते थे लेकिन यह शायद इतना आसान है कि उन्होंने नहीं सोचा था कि यह एक विशिष्ट शामिल है। –

0

बढ़ावा checked_deleter बेहतर लगता है:

template<class T> struct checked_deleter 
{ 
    typedef void result_type; 
    typedef T * argument_type; 
    void operator()(T * p) const; 
}; 

क्योंकि कुछ संकलक 0 वापस आ सकते हैं जबकि टी undefine है, उस मामले

enum { type_must_be_complete = sizeof(T) }; 

में एक वैध स्थिर ज़ोर है, लेकिन checked_deleter में विफल रहा होगा।

http://www.boost.org/doc/libs/1_59_0/libs/core/doc/html/core/checked_delete.html#core.checked_delete.checked_deleter

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