इसे समझने के लिए enum
, इसके बिना विध्वंसक पर विचार करने के साथ शुरू करें:
~scoped_ptr() {
delete ptr_;
}
जहां ptr_
एक है C*
। यदि C
इस बिंदु पर टाइप अधूरा है, यानी वह सब जो कंपाइलर जानता है struct C;
, तो (1) एक डिफ़ॉल्ट-जेनरेट डू-नथिंग डिस्ट्रक्टर को इंगित किए गए C उदाहरण के लिए उपयोग किया जाता है। स्मार्ट पॉइंटर द्वारा प्रबंधित ऑब्जेक्ट के लिए यह सही होने की संभावना नहीं है।
यदि एक पॉइंटर को अपूर्ण प्रकार से हटाने पर हमेशा अपरिभाषित व्यवहार होता है, तो मानक को केवल कंपाइलर का निदान करने और विफल होने की आवश्यकता हो सकती है। लेकिन यह अच्छी तरह से परिभाषित है जब वास्तविक विनाशकारी तुच्छ है: ज्ञान जो प्रोग्रामर के पास हो सकता है, लेकिन संकलक के पास नहीं है। भाषा क्यों परिभाषित करती है और इसे अनुमति देती है यह मेरे से परे है, लेकिन C ++ कई प्रथाओं का समर्थन करता है जिन्हें आज सर्वोत्तम प्रथाओं के रूप में नहीं माना जाता है।
एक पूर्ण प्रकार का एक ज्ञात आकार होता है, और इसलिए, sizeof(C)
यदि और केवल C
एक पूर्ण प्रकार है - ज्ञात विध्वंसक के साथ संकलित करेगा । तो यह एक गार्ड के रूप में इस्तेमाल किया जा सकता है। एक तरीका बस होगा
(void) sizeof(C);
मुझे लगता है कि कुछ संकलक और विकल्पों के साथ संकलक इसे दूर कर देता है इससे पहले कि यह नोटिस कर सकता है कि यह संकलन नहीं करना चाहिए, और यह इस enum
तरह के गैर-अनुरूप संकलक व्यवहार से बचने का एक तरीका है:
enum { type_must_be_complete = sizeof(C) };
enum
केवल एक खारिज अभिव्यक्ति के बजाय विकल्प के लिए एक वैकल्पिक स्पष्टीकरण , बस व्यक्तिगत पसंद है।
या जैसा कि जेम्स टी। हगेट इस उत्तर के लिए एक टिप्पणी में सुझाव देते हैं , "संकलन समय पर एक छद्म पोर्टेबल त्रुटि संदेश बनाने का एक तरीका हो सकता है"।
(1) अपूर्ण प्रकार के लिए डिफ़ॉल्ट-जेनरेट डू-नथिंग डिस्ट्रक्टर पुराने के साथ एक समस्या थी std::auto_ptr
। यह इतना कपटी था कि इसने PIMPL मुहावरे के बारे में एक GOTW आइटम में अपनी जगह बनाई , जिसे अंतर्राष्ट्रीय C ++ मानकीकरण समिति हर्ब सटर की कुर्सी द्वारा लिखा गया था। बेशक, आजकल जो std::auto_ptr
पदावनत है, कोई इसके बजाय किसी अन्य तंत्र का उपयोग करेगा।
ptr_
अपने आप मेंsizeof
के रूप मेंsizeof(*ptr_)
के बजायsizeof(C)
।