मैंने this article लिखा और उस पर कुछ टिप्पणियां मिलीं जो मुझे भ्रमित करती थीं।क्या यह सच है कि एक auto_ptr घोषणा, auto_ptr घोषणा के विपरीत, अच्छी तरह परिभाषित है जब इसका टेम्पलेट प्रकार अपूर्ण प्रकार का है?
यह मूल रूप से करने पर निर्भर करता मेरी T2
केवल टेम्पलेट पैरामीटर के रूप में इस्तेमाल भी देखा है और गलती से निष्कर्ष है कि इसलिए मैं आगे घोषणा के अवसर ले सकता है के लिए कूद गया:
struct T2;
struct T1
{
std::auto_ptr<T2> obj;
};
यह यूबी का आह्वान करता है, तो मैं डॉन ' टी एक ही टीयू में कहीं T2
परिभाषित करने के लिए पर जाना है, क्योंकि std::auto_ptr<T2>
कॉल delete
अपने आंतरिक T2*
पर, और calling delete
on an pointer to an object of an incomplete type whose complete type has a non-trivial destructor is undefined:
[C++11: 5.3.5/5]:
हैं हटाए जाने वाले ऑब्जेक्ट में अपूर्ण वर्ग के प्रकार को अपूर्ण बिंदु पर रखा गया है और पूर्ण वर्ग में एक गैर-तुच्छ विनाशक या एक विलोपन समारोह है, व्यवहार अपरिभाषित है।टिप्पणी:
जीसीसी toolchain मैं (Sourcery जी ++ लाइट 2009q1-203) — — v4.3.3 का उपयोग किया हुआ मुझे एक नोट के साथ यह बताने के लिए तरह पर्याप्त था न नाशक है और न ही क्लास-विशिष्ट ऑपरेटर डिलीट को कॉल किया जाएगा, भले ही कक्षा को परिभाषित किया गया हो।
हालांकि अन्य जीसीसी संस्करणों में यह निदान प्राप्त करना मुश्किल लगता है।
मेरे चंगुल में यह एक अधूरी प्रकार का एक उदाहरण के लिए सूचक ing अगर delete
इस तरह एक बग को पहचानना बहुत आसान होता था रहे थे बीमार का गठन बल्कि यूबी से है, लेकिन उस के लिए एक intractible समस्या की तरह लगता है हल करने के लिए एक कार्यान्वयन, इसलिए मैं समझता हूं कि यह यूबी क्यों है।
लेकिन फिर मुझे बताया गया कि, यदि मैंका उपयोग करना चाहता था, तो यह सुरक्षित और अनुपालनशील होगा।
n3035 कथित तौर पर 20.9.10.2 में कहते हैं:
टेम्पलेट पैरामीटर
unique_ptr
कीT
एक अधूरी प्रकार हो सकता है।
सभी मैं सी ++ 11 उचित में मिल सकती है:
[C++11: 20.7.1.1.1]:
/1
default_delete
वर्ग टेम्पलेट के लिए डिफ़ॉल्ट Deleter (विनाश नीति) के रूप में कार्य वर्ग टेम्पलेटunique_ptr
।/2 टेम्पलेट पैरामीटर
default_delete
कीT
एक अधूरी प्रकार हो सकता है।
[C++11: 20.7.1.1.2/4]:
तोT
एक अधूरी प्रकार है, कार्यक्रम बीमार बनाई है:लेकिन,
default_delete
केoperator()
एक पूरा प्रकार की आवश्यकता है।
मुझे लगता है मेरे सवाल यह है:
मेरे लेख पर टिप्पणी करने वालों का कहना है कि एक अनुवाद केवल निम्न कोड से मिलकर इकाई अच्छी तरह से बनाई है और अच्छी तरह से परिभाषित में सही हैं? या वे गलत हैं?
struct T2;
struct T1
{
std::unique_ptr<T2> obj;
};
वे सही, कैसे एक संकलक यह लागू होने की उम्मीद है रहे हैं, तो दिए गए वहाँ यूबी किया जा रहा है इसके लिए अच्छा कारण हैं कि, कम से कम एक std::auto_ptr
प्रयोग किया जाता है जब?
क्योंकि शब्द 'कार्यक्रम खराब है' (बिना किसी स्पष्ट 'और कोई निदान की आवश्यकता है') और उदा। 'इसका परिणाम अपरिभाषित व्यवहार में होता है', यह * का मतलब है कि एक निदान की आवश्यकता है (जिसे 'static_assert (sizeof (टी)," ") के रूप में कार्यान्वित किया जा सकता है।)। तो हाँ, 'std :: unique_ptr' std :: auto_ptr 'से सुरक्षित है। (लेकिन ध्यान दें कि डिफ़ॉल्ट 'std :: default_delete 'डिलीटर के उपयोग के कारण है। –
मैं यह स्पष्ट करना चाहता था कि' कोड अच्छी तरह से गठित और अच्छी तरह से परिभाषित '/' यूबी 'नहीं है' केवल दो संभावित परिणाम नहीं। (ऐसा नहीं हो सकता है कि आप जो व्यक्त करना चाहते थे, लेकिन मैं स्पष्ट होना चाहूंगा।) –