2013-03-15 17 views
5

सी ++ 11 में हम हमेशा unique_ptr का उपयोग करना चाहिए या shared_ptr बजाय new/delete की? प्रदर्शन के साथ यह कैसे है, स्मार्ट पॉइंटर्स बहुत धीमे हैं?सी ++ 11 स्मार्ट पॉइंटर्स हमेशा नए/हटाए जाने के बजाय?

+14

'unique_ptr' को शून्य-लागत वाले अमूर्त होने के लिए डिज़ाइन किया गया था। चिंता करना बंद करो और बम से प्यार करना सीखें। –

+9

हम ** 'new' और' delete' के बजाय स्मार्ट पॉइंटर्स ** का उपयोग कैसे कर सकते हैं। 'हटाएं' – iammilind

+4

@iammilind 'make_shared' से बचने के लिए हमें **' new' के साथ ** ** का उपयोग करना होगा और मैं 'make_unique' के कार्यान्वयन का भी उपयोग करता हूं। बेशक अभी भी आंतरिक रूप से 'नया' का उपयोग करता है। – Cubic

उत्तर

7

unique_ptr नहीं जो भी कच्चे संकेत उपयोग की तुलना में किसी भी क्रम भूमि के ऊपर है (करने वाला नहीं है) करता है। shared_ptr में कुछ मेमोरी और टाइम ओवरहेड है (कार्यान्वयन पर कितना निर्भर करता है)। व्यावहारिक भूमि के ऊपर यहाँ आसानी से शून्य हो सकता है यदि आप वास्तव में कुछ है कि एक shared_ptr तरह बर्ताव करता है की जरूरत है (जो है, कोई अन्य कार्यान्वयन आप में से लगता है कि किसी भी तेजी से या अधिक स्मृति कुशल हो जाएगा)।

कहने के लिए आप नए का उपयोग कभी नहीं करेंगे नहीं है यही कारण है कि/अपने कोड में हटा सकते हैं, लेकिन यह कुछ आप हर समय करूँगा नहीं है।

2

मैं) क्योंकि-

1 कच्चे स्मृति को संभालने के लिए यह RAII और Counted body मुहावरों इस प्रकार shared_ptr पसंद करेंगे।

2) वस्तु को नष्ट कर दिया जाना निश्चित है, स्मृति, भले ही अपवाद तब होता है जारी किया गया है।

3) जब नए के लिए निर्णय लेने की कोई और अधिक Choas/हटा सकते हैं।

+0

प्वाइंट 2 सत्य नहीं है। यदि कोई share_ptr किसी ऑब्जेक्ट को संदर्भित करता है जिसमें shared_ptr होता है जो किसी भी तरह से पहले वापस संदर्भित करता है। आपके पास मेमोरी रिसाव होगा। संपादित करें: तो आपको अभी भी यह जानने की आवश्यकता होगी कि आप स्मार्ट पॉइंटर्स के साथ या उसके बिना क्या हैं। – Tim

+0

प्वाइंट 2 सत्य है, चक्रीय संदर्भ एक "मान्य" राज्य है। 'shared_ptr' आपको केवल तभी देता है जब' ref_count == 0' उसकी कॉल 'हटाएं'। – Yankes

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