2010-08-10 14 views
12

मैंने हाल ही में std::auto_ptr की सराहना शुरू कर दी है और अब मैंने पढ़ा है कि यह deprecated होगा।क्या मुझे auto_ptr का उपयोग करना बंद कर देना चाहिए?

  • एक कारखाने
  • संचार स्वामित्व हस्तांतरण

उदाहरण के मूल्य में वापसी:

// Exception safe and makes it clear that the caller has ownership. 
std::auto_ptr<Component> ComponentFactory::Create() { ... } 

// The receiving method/function takes ownership of the pointer. Zero ambiguity. 
void setValue(std::auto_ptr<Value> inValue); 

समस्याग्रस्त प्रतिलिपि अर्थ विज्ञान के बावजूद मैं auto_ptr उपयोगी पाते हैं मैं दो स्थितियों के लिए उपयोग शुरू कर दिया। और उपर्युक्त उदाहरणों के लिए एक विकल्प प्रतीत नहीं होता है।

क्या मुझे बस इसका उपयोग करना जारी रखना चाहिए और बाद में std::unique_ptr पर स्विच करना चाहिए? या यह टाला जा सकता है?

+2

मैं जो भी प्रोजेक्ट आप काम कर रहा हूं, उसके लिए मैं 'auto_ptr' के साथ छड़ी कहूंगा, और जब भी आप कुछ नया शुरू करेंगे स्विच करें, ताकि आप उन्हें एक साथ मिलाकर जटिलता नहीं बना रहे। (मैं उस 'कंपाइलर' को मान रहा हूं जिसका आप समर्थन 'unique_ptr' का उपयोग करते हैं।) –

+0

'std :: auto_ptr' को बहिष्कृत नहीं किया जा रहा है क्योंकि यह उपयोगी नहीं है, लेकिन क्योंकि' std :: unique_ptr' वह सब कुछ करता है जो पहले से ही करता है, बस बेहतर तो क्या आप 'std :: unique_ptr' पर स्विच करते हैं या नहीं, 'std :: auto_ptr' का उपयोग बंद करने का कोई कारण नहीं है। –

+0

एरिक लिपर्ट ने इस बारे में बहुत समय पहले लिखा था। यह एक दिलचस्प पठन है: http://blogs.msdn.com/b/ericlippert/archive/2003/09/16/53016.aspx –

उत्तर

5

यह त्रुटियों के बावजूद बहुत उपयोगी है, कि मैं अत्यधिक उपयोग करने की सलाह देता हूं और इसे उपलब्ध होने पर unique_ptr पर स्विच करने की अत्यधिक अनुशंसा करता हूं।

::std::unique_ptr एक ऐसे कंपाइलर की आवश्यकता है जो रावल्यू संदर्भों का समर्थन करता है जो सी ++ 0x ड्राफ्ट मानक का हिस्सा हैं, और इसमें थोड़ी देर लग जाएगी क्योंकि इसके लिए वास्तव में व्यापक समर्थन होना चाहिए। और जब तक रैवल्यू संदर्भ उपलब्ध नहीं होते हैं, ::std::auto_ptr सबसे अच्छा है जो आप कर सकते हैं।

आपके कोड में ::std::auto_ptr और ::std::unique_ptr दोनों होने से कुछ लोगों को भ्रमित कर सकता है। लेकिन जब आप इसे बदलने का निर्णय लेते हैं तो आपको ::std::unique_ptr के लिए खोज और प्रतिस्थापित करने में सक्षम होना चाहिए। यदि आप ऐसा करते हैं तो आपको कंपाइलर त्रुटियां मिल सकती हैं, लेकिन उन्हें आसानी से ठीक किया जाना चाहिए। this question about replacing ::std::auto_ptr with ::std::unique_tr के शीर्ष रेटेड उत्तर में अधिक जानकारी है।

+0

लेकिन एक परियोजना के भीतर लगातार बने रहें। दो प्रकार के होने से भी बदतर कुछ भी नहीं है जो एक ही चीज़ करते हैं लेकिन अलग-अलग नामों के साथ। –

+0

तकनीकी रूप से, 'unique_ptr'' auto_ptr' के लिए ड्रॉप-इन प्रतिस्थापन नहीं है। अन्य चीजों के अलावा, यह एक निश्चित संकलक त्रुटि को एक निश्चित संकलक त्रुटि में बदल देता है। यह आम तौर पर एक अच्छी बात है, इसलिए संभवतः आप उपलब्ध होने के बाद एक खोज-प्रतिस्थापन करना चाहेंगे, इस ट्रिगर को किसी भी कंपाइलर त्रुटियों को ठीक करना। Http://stackoverflow.com/questions/3451099 – Brian

+0

@Brian देखें - उस लिंक के लिए धन्यवाद। मैं आपकी स्पष्टीकरण और उस लिंक को सुबह में अपने उत्तर में शामिल करूंगा। :-) – Omnifarious

-1

मेरा सुझाव है कि आप स्मार्ट पॉइंटर्स को बढ़ावा देने के लिए जाएं।

+9

वे एक ही समस्या को हल नहीं करते हैं। बूस्ट सब कुछ का जवाब नहीं है, इससे कोई फर्क नहीं पड़ता कि यह कितना उपयोगी है। – Omnifarious

+0

बूस्ट स्मार्ट पॉइंटर्स उनके साथ कुछ ओवरहेड सहन करते हैं। shared_ptr एक अतिरिक्त मेमोरी आवंटन करता है, intrusive_ptr को एक एम्बेडेड काउंटर की आवश्यकता होती है। auto_ptr के लिए अभी तक कोई अच्छा विकल्प नहीं है। –

+0

ओमनी ने क्या कहा। बूस्ट के स्मार्ट पॉइंटर्स में से कोई भी स्वामित्व का हस्तांतरण समर्थन नहीं करता है, क्योंकि मानक लाइब्रेरी पहले से ही उस कार्यक्षमता को प्रदान करती है और वर्तमान मानक में भी संभव है।यदि 'std :: auto_ptr' काम करता है, तो बूस्ट के साझा पॉइंटर्स में से किसी एक का उपयोग लगभग निश्चित रूप से एक गलती है [' boost :: scoped_ptr' पर्याप्त हो सकता है, लेकिन उन स्थितियों में अपेक्षाकृत सीमित हैं] –

1

बहिष्कृत इसका मतलब यह नहीं है कि यह दूर जा रहा है, बस एक बेहतर विकल्प होगा।

मैं वर्तमान कोड पर इसका उपयोग जारी रखने का सुझाव देता हूं, लेकिन नए कोड (नए प्रोग्राम या मॉड्यूल, वर्तमान कोड में छोटे बदलावों) पर नए विकल्प का उपयोग करने का सुझाव देता हूं। संगठनात्मकता महत्वपूर्ण है

+1

इसका मतलब यह है कि यह * भविष्य में किसी बिंदु पर * दूर हो सकता है। – jalf

+0

इसे सी ++ 17 में हटा दिया गया है http://en.cppreference.com/w/cpp/memory/auto_ptr –

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