2012-02-20 12 views
8

पर "स्वामित्व, सूत्रों का कहना है, और सिंक" यह site कहता है:क्या इन दो स्रोतों के बीच `auto_ptr` टेम्पलेट वर्ग के बारे में कोई विरोधाभास है?

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

अब, templacte<classX> class auto_ptr के लिए operator=() की परिभाषा पर विचार अध्याय 14 में Stroustrup के सी ++ प्रोग्रामिंग भाषा तीसरा संस्करण के पेज 368:

auto_ptr& operator=(auto_ptr& a) throw() { ptr = a.ptr; a.ptr = 0; }

मैं ऑपरेटर वस्तु को मुक्त नहीं देख सकते हैं द्वारा ptr != 0 पर संबोधित!

+2

कुछ और संदिग्ध: कि 'ऑपरेटर =' कुछ भी वापस नहीं कर रहा है। – Mat

+0

@ एसबीआई सी ++ प्रोग्रामिंग भाषा तीसरा संस्करण – Belloc

+0

'ptr' का प्रकार क्या है? क्या वह 'क्लासएक्स * 'या' auto_ptr_guts 'है? यदि यह उत्तरार्द्ध है, तो ऊपर दिया गया कोड काफी छोटा होगा। – MSalters

उत्तर

4

हां, यह कोड के बाद के टुकड़े में निश्चित रूप से एक बग है। ptr द्वारा ऑब्जेक्ट की ओर इशारा किया गया delete डी ptr पर एक नया मान सौंपा गया है, अन्यथा मूल रूप से ptr द्वारा इंगित ऑब्जेक्ट को लीक किया जाएगा।

+0

उत्सुकता से, इरेटा में भी (http://www2.research.att.com/~bs/3rd_printing5.html) हटाने का उल्लेख नहीं किया गया है। – Belloc

+0

@ user1042389: कुछ बग साल के लिए कोडबेस में बैठते हैं। – sharptooth

+1

@ शार्पतोथ: विशेष रूप से अप्रयुक्त कोड बेस - ऐसा नहीं है कि सी ++ पीएल में कोड स्वचालित रूप से 'auto_ptr' के उत्पादन कार्यान्वयन के भंडार से निकाला जा रहा है। –

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