2016-08-23 22 views
11

मेरे पास एक फैक्ट्री विधि है जो वस्तुओं का एक समूह बनाता है और उन्हें पॉइंटर्स देता है। ऑब्जेक्ट्स का स्वामित्व कॉलर को स्थानांतरित करता है:पॉइंटर्स (और स्वामित्व) के वेक्टर को वापस कैसे करें C++ 11

std::vector<animal*> create_zoo(); 

यह काम करता है, लेकिन स्मृति रिसाव के लिए प्रवण है।

auto zoo = create_zoo(); 

वेक्टर ढेर पर है और स्वचालित रूप से साफ हो जाता है, निहित ऑब्जेक्ट नहीं है।

विभिन्न उप-प्रकारों के ऑब्जेक्ट लौटा दिए जाते हैं। पॉइंटर्स के बजाय मूल्यों को पुनर्प्राप्त करना नहीं होगा।

मैं

std::vector<std::unique_ptr<animal> > create_zoo(); 

उपयोग करने के लिए सोच रहा था लेकिन unique_ptr प्रतिलिपि अर्थ विज्ञान नहीं है और मैं मूल्य है, जो, सिद्धांत रूप में, एक कॉपी बन जाती द्वारा vector लौट आते हैं।

मैं से बचने के लिए कि

std::unique_ptr<std::vector<std::unique_ptr<animal> > > create_zoo(); 

लेकिन यह हास्यास्पद हो रही है ढेर पर vector डाल सकता है।

यह भी काम करना चाहिए:

std::vector<std::shared_ptr<animal> > create_zoo(); 

यह काम करेगा, लेकिन यह वास्तव में स्वामित्व का हस्तांतरण नहीं है। कॉलर को यह मानना ​​है कि वस्तुओं के लिए अन्य संकेतक हो सकते हैं।

मैं सुझावों के लिए खुला हूं। std::vector होने की आवश्यकता नहीं है। मैं सिर्फ ऐसे फैक्ट्री को लागू करने का एक अच्छा तरीका ढूंढ रहा हूं जो आधुनिक सी ++ के साथ कई ऑब्जेक्ट्स का स्वामित्व देता है। मैं अब के लिए बढ़ावा से परहेज कर रहा हूँ। मैं नई सी ++ 11 सामान का पता लगाने की कोशिश कर रहा हूं।

+0

आप फिर से विचार कर सकते हैं कि आपको पॉइंटर्स के रूप में आवंटित पशु वस्तुओं की आवश्यकता है या नहीं। 'std :: वेक्टर 'आपके उद्देश्यों के लिए भी काम कर सकता है। पशु वस्तुओं को वेक्टर के साथ आवंटित किया जाएगा और आगे बढ़ने के बाद इसके साथ आगे बढ़ेगा। –

उत्तर

13

std::vector<std::unique_ptr<animal>> ठीक काम करेगा: फ़ंक्शन-स्थानीय मान लौटने से इसे कॉपी नहीं किया जाएगा, या इसकी प्रतिलिपि नहीं है (या केवल अगर चलाना उपलब्ध नहीं है)।

+0

हम्म .. क्या यह इंगित नहीं करेगा कि मेरा कोड "रिटर्न वैल्यू ऑप्टिमाइज़ेशन" करने के लिए कंपाइलर की क्षमता पर निर्भर है? मैं समझता हूं कि सभी प्रासंगिक कंपाइलर्स ने इसे कार्यान्वित किया है, लेकिन मुझे यकीन नहीं है कि क्या वे वास्तव में सभी परिस्थितियों में इसे करने की गारंटी देते हैं। क्या यह मानक अभ्यास है? – Stefan

+6

@Stefan नहीं, यह आरवीओ नहीं है। आरवीओ फ़ंक्शन-लोकल को पूरी तरह से हटा देगा, और कॉलर की तरफ उसके स्थान पर एक का उपयोग करेगा। यह 'वापसी' के बारे में है- अस्थायी लौटे ऑब्जेक्ट का निर्माण (अगर आरवीओ पहले से विफल रहा)। – Quentin

+2

मैं बस इतना लापता था! पाइथन के 6 साल बाद सी ++ पर लौट रहा है। मैं जंगली और खराब दोनों महसूस करता हूँ। इस "चाल" सामान पर पढ़ने के लिए जा रहे हैं। धन्यवाद! – Stefan

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