[c++] मानक कंटेनरों के साथ std :: auto_ptr <> का उपयोग करना गलत क्यों है?



Answers

auto_ptr की प्रति semantics कंटेनर के साथ संगत नहीं हैं।

विशेष रूप से, एक auto_ptr को दूसरे में कॉपी करने से दो बराबर ऑब्जेक्ट्स नहीं auto_ptr हैं क्योंकि किसी ने पॉइंटर का स्वामित्व खो दिया है।

अधिक विशेष रूप से, एक auto_ptr प्रतिलिपि बनाने से प्रतियों में से एक पॉइंटर को जाने देता है। कंटेनर में इनमें से कौन सा अवशेष परिभाषित नहीं किया गया है। इसलिए, यदि आप कंटेनरों में auto_ptrs स्टोर करते हैं तो आप यादृच्छिक रूप से पॉइंटर्स तक पहुंच खो सकते हैं।

Question

मानक कंटेनरों के साथ std::auto_ptr<> का उपयोग करना गलत क्यों है?




एसटीएल कंटेनरों को आपके द्वारा संग्रहीत वस्तुओं की प्रतिलिपि बनाने में सक्षम होना चाहिए, और मूल और प्रतिलिपि समकक्ष होने की अपेक्षा करने के लिए डिज़ाइन किया गया है। ऑटो पॉइंटर ऑब्जेक्ट्स का एक पूरी तरह से अलग अनुबंध है, जिससे प्रतिलिपि स्वामित्व का हस्तांतरण बनाती है। इसका मतलब है कि auto_ptr के कंटेनर उपयोग के आधार पर अजीब व्यवहार प्रदर्शित करेंगे।

प्रभावी एसटीएल (स्कॉट मेयर्स) आइटम 8 में गलत क्या हो सकता है और प्रभावी सी ++ (स्कॉट मेयर्स) आइटम 13 में एक विस्तृत विवरण भी नहीं है।




सी ++ 03 मानक (आईएसओ-आईईसी 14882-2003) धारा 20.4.5 अनुच्छेद 3 में कहता है:

[...] [ नोट: [...] auto_ptr मानक लाइब्रेरी कंटेनर तत्वों के लिए CopyConstructible और असाइन करने योग्य आवश्यकताओं को पूरा नहीं करता है और इस प्रकार एक मानक पुस्तकालय कंटेनर को एक auto_ptr परिणामों के साथ अपरिभाषित व्यवहार में तुरंत चालू करता है। - अंत नोट ]

सी ++ 11 मानक (आईएसओ-आईईसी 14882-2011) परिशिष्ट डी 10.1 अनुच्छेद 3 में कहता है:

[...] नोट: [...] auto_ptr के उदाहरण MoveConstructible और MoveAssignable की आवश्यकताओं को पूरा करते हैं, लेकिन CopyConstructible और CopyAssignable की आवश्यकताओं को पूरा नहीं करते हैं। - अंत नोट]

सी ++ 14 मानक (आईएसओ-आईईसी 14882-2014) परिशिष्ट सी 4.2 अनुलग्नक डी में कहता है: संगतता विशेषताएं:

बदलें : वर्ग टेम्पलेट्स auto_ptr, unary_function, और binary_function, फ़ंक्शन टेम्पलेट्स random_shuffle, और फ़ंक्शन टेम्पलेट्स (और उनके रिटर्न प्रकार) ptr_fun, mem_fun, mem_fun_ref, bind1st, और bind2nd परिभाषित नहीं हैं।
तर्क : नई सुविधाओं द्वारा प्रतिस्थापित।
मूल सुविधा पर प्रभाव : मान्य सी ++ 2014 कोड जो इन वर्ग टेम्पलेट्स और फ़ंक्शन टेम्पलेट का उपयोग करता है, इस अंतर्राष्ट्रीय मानक में संकलित करने में विफल हो सकता है।






Links