2012-01-12 8 views
15

मैं किसी भी स्थिति के बारे में सोच नहीं सकता है, जहांक्या वस्तुओं का निर्माण करते समय std :: make_shared का उपयोग न करने का कोई कारण नहीं है?

std::shared_ptr<Object> obj(new Object("foo", 1)); 

auto obj = std::make_shared<Object>("foo", 1); 

बाद हमेशा बेहतर इलाके में परिणाम और स्मृति विखंडन को कम कर देता करने के लिए प्राथमिकता दी जाएगी। क्या कोई ऐसी स्थिति है, जहां आप कच्चे पॉइंटर्स लौटने वाले कोड के साथ इंटरफेसिंग को छोड़कर, पहले फॉर्म का उपयोग करने के लिए (या मजबूर होना) पसंद करेंगे?

+4

मुझे लगता है, आप कच्चे पॉइंटर्स के साथ इंटरफेसिंग करने के लिए 'std :: unique_ptr ' से कनवर्ट करने पर विचार करेंगे? क्योंकि मुझे लगता है कि यह कैननिकल प्रकार कारखाने के कार्यों से वापस किया जाना है। अन्य पॉइंटर्स को "कच्चे पॉइंटर्स" के रूप में माना जाएगा और आधुनिक सी ++ में एक जगह होगी? –

उत्तर

18

उत्तरार्द्ध हमेशा बेहतर इलाके में परिणाम देता है और स्मृति विखंडन को कम करता है।

नहीं हमेशा। एक कार्यान्वयन संदर्भ गिना वस्तु और संदर्भ गिनती के लिए एक भी आवंटन उपयोग करने के लिए प्रोत्साहित किया जाता है, लेकिन यह आवश्यक ऐसा करने के लिए नहीं है।

तुम क्यों std::make_shared उपयोग करने के लिए नहीं करने चाहिए? उस मामले पर विचार करें जहां आपके पास std::shared_ptr के स्वामित्व वाली एक बड़ी गतिशील आवंटित वस्तु है और आप जानते हैं कि इस ऑब्जेक्ट के कमजोर संदर्भ होंगे जो वस्तु के मजबूत संदर्भों को पार करने की संभावना है (शायद वहां कई कमजोर संदर्भ हैं और केवल एक या दो अल्पकालिक मजबूत संदर्भ)। आवंटित ब्लॉक (जो बड़ी है, याद), जब तक वहाँ कोई मजबूत या कर रहे हैं नष्ट नहीं किया जा सकता है:

इस मामले में, std::make_shared संभालने यह एक खंड है कि दोनों वस्तु और संदर्भ गिनती का मालिक आवंटित एक गरीब विकल्प होगा, वस्तु के लिए कमजोर संदर्भ छोड़ दिया।

आप गतिशील वस्तु अपने आप को आवंटित और std::shared_ptr निर्माता सूचक पारित करने के लिए थे, तो स्मृति वस्तु के कब्जे में जैसे ही वहाँ के रूप में शेष कोई मजबूत संदर्भ, वहाँ अभी भी कमजोर संदर्भ हैं, भले ही कर रहे हैं जारी किया जा सकता है।

+0

यह एक अच्छा मुद्दा है। अब जब मैं इसके बारे में सोचता हूं, किसी ऑब्जेक्ट के साथ संदर्भ गणना को जोड़ना भी गलत साझाकरण हो सकता है, जो बहु-थ्रेडेड परिदृश्य में प्रदर्शन को प्रभावित कर सकता है। –

0

आप एक वस्तु वस्तु के जीवन में साझा करने के लिए कई इकाइयां होंगी कि निर्माण कर रहे हैं, तो हाँ, आप जहां संभव std :: make_shared का उपयोग करना पसंद करना चाहते हैं। कुछ जगहें संभव नहीं हो सकती हैं यदि आप किसी और से पॉइंटर प्राप्त करते हैं; उदाहरण के लिए, एक कारखाने एक कच्चे सूचक या एक std :: unique_ptr वापस कर सकती है कि आप एक shared_ptr में स्टोर करने के लिए, इस प्रकार make_shared के उपयोग को रोकने के लिए चाहते हैं।

शीर्षक में प्रश्न थोड़ा अलग है; ऐसे कई कारण हैं जिनसे आप अपनी ऑब्जेक्ट्स के लिए shared_ptr का उपयोग नहीं करना चाहते हैं। यदि आप वास्तव में कई ऑब्जेक्ट्स द्वारा साझा किया जाता है तो आपको केवल shared_ptr का उपयोग करना चाहिए। अन्यथा, ऑब्जेक्ट आवंटित करने या unique_ptr का उपयोग करके स्टैक पसंद करें।

0

आधुनिक IDEs है सुविधा "प्रयोगों खोजें"। यदि आप ऑब्जेक्ट का निर्माण करने के लिए std::make_shared का उपयोग करते हैं, तो जब आप उन स्थानों की खोज करते हैं जहां उस ऑब्जेक्ट के निर्माता को कॉल किया जाता है, तो आईडीई उन स्थानों को नहीं दिखाएगा जहां std::make_shared का उपयोग किया जाता है।

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