2011-01-12 17 views
29

मेरे पास किसी ऑब्जेक्ट के लिए पॉइंटर है। मैं इसे दो कंटेनर में स्टोर करना चाहता हूं, जिनमें दोनों स्वामित्व हैं। तो मुझे लगता है कि मैं इसे C++ 0x का साझा_ptr बनाना अच्छा होगा। मैं एक कच्चे सूचक को एक साझा_पोइंटर में कैसे परिवर्तित कर सकता हूं?कच्चे सूचक से साझा_ptr बनाना

typedef unordered_map<string, shared_ptr<classA>>MAP1; 
MAP1 map1; 
classA* obj = new classA(); 
map1[ID] = how could I store obj in map1?? 

धन्यवाद

उत्तर

28

आप सुनिश्चित करें कि आप एक ही कच्चे सूचक के साथ दोनों 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! 
+2

डॉन; एक चर में कच्चे सूचक का पर्दाफाश नहीं करते हैं। ऐसा करके आप एक रखरखाव को पेंच करने और रॉ पॉइंटर को किसी अन्य साझा सूचक में डालने का एक आसान अवसर देते हैं। बस 'my_ptr (new classA()) का उपयोग करें;' इस तरह एक रखरखाव को चीजों को पेंच करने के लिए अतिरिक्त काम करना पड़ता है। –

+0

@ मार्टिन यॉर्क मैं बस इसके बारे में एक बिंदु शामिल करने के लिए संपादन कर रहा था; मैं एक और स्पष्ट नोट जोड़ दूंगा। लेकिन आप सही हैं। :) – Dawson

+0

'// या shared_ptr my_ptr = raw_ptr;' std :: shared_ptr' में गलत है, क्योंकि इसे '// या shared_ptr my_ptr (raw_ptr) के रूप में स्पष्ट होना चाहिए;'। – Justme0

3

आप विभिन्न तरीकों से उपयोग कर सकते हैं, लेकिन रीसेट() अच्छा होगा:

map1[ID].reset(obj); 

और होने का मुद्दा दो नक्शे ही shared_ptr का उल्लेख संबोधित करने के लिए, हम कर सकते हैं:

map2[ID] = map1[ID]; 

ध्यान दें कि डबल डिलीट से बचने के लिए आम तौर पर चाल कच्चे पॉइंटर्स से बचने का प्रयास करना है। इसलिए से बचने:

classA* obj = new classA(); 
map1[ID].reset(obj); 

लेकिन इसके बजाय सीधे एक shared_ptr में नए ढेर वस्तु डाल दिया।

+0

यह प्रति बुरा व्यवहार नहीं है, यह सी-अभ्यास है! – g24l

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