आप सुनिश्चित करें कि आप एक ही कच्चे सूचक के साथ दोनों shared_ptr वस्तुओं को प्रारंभ नहीं है बनाने की जरूरत है, या यह दो बार हटा दिया जाएगा। एक बेहतर (लेकिन अभी भी बुरा) जिस तरह से यह करने के लिए:
classA* raw_ptr = new classA;
shared_ptr<classA> my_ptr(raw_ptr);
// or shared_ptr<classA> my_ptr = raw_ptr;
// ...
shared_ptr<classA> other_ptr(my_ptr);
// or shared_ptr<classA> other_ptr = my_ptr;
// WRONG: shared_ptr<classA> other_ptr(raw_ptr);
// ALSO WRONG: shared_ptr<classA> other_ptr = raw_ptr;
चेतावनी: उपरोक्त कोड खराब व्यवहार का पता चलता! raw_ptr
बस एक चर के रूप में मौजूद नहीं होना चाहिए। यदि आप new
के परिणामस्वरूप सीधे अपने स्मार्ट पॉइंटर्स को प्रारंभ करते हैं, तो आप गलती से अन्य स्मार्ट पॉइंटर्स को गलत तरीके से प्रारंभ करने का जोखिम कम कर देते हैं। आपको क्या करना चाहिए:
shared_ptr<classA> my_ptr(new classA);
shared_ptr<classA> other_ptr(my_ptr);
क्या अच्छा है कि कोड भी संक्षिप्त है।
संपादित
शायद मैं इसे कैसे एक नक्शे के साथ काम करेगा पर विस्तृत करना चाहिए। यदि आपके पास कच्चे सूचक और दो मानचित्र थे, तो आप ऊपर जो दिखाए गए हैं उसके समान कुछ कर सकते हैं।
unordered_map<string, shared_ptr<classA> > my_map;
unordered_map<string, shared_ptr<classA> > that_guys_map;
shared_ptr<classA> my_ptr(new classA);
my_map.insert(make_pair("oi", my_ptr));
that_guys_map.insert(make_pair("oi", my_ptr));
// or my_map["oi"].reset(my_ptr);
// or my_map["oi"] = my_ptr;
// so many choices!
डॉन; एक चर में कच्चे सूचक का पर्दाफाश नहीं करते हैं। ऐसा करके आप एक रखरखाव को पेंच करने और रॉ पॉइंटर को किसी अन्य साझा सूचक में डालने का एक आसान अवसर देते हैं। बस 'my_ptr (new classA()) का उपयोग करें;' इस तरह एक रखरखाव को चीजों को पेंच करने के लिए अतिरिक्त काम करना पड़ता है। –
@ मार्टिन यॉर्क मैं बस इसके बारे में एक बिंदु शामिल करने के लिए संपादन कर रहा था; मैं एक और स्पष्ट नोट जोड़ दूंगा। लेकिन आप सही हैं। :) – Dawson
'// या shared_ptr my_ptr = raw_ptr;' std :: shared_ptr' में गलत है, क्योंकि इसे '// या shared_ptr my_ptr (raw_ptr) के रूप में स्पष्ट होना चाहिए;'। –
Justme0