2008-09-26 13 views
6

मान लें मैं एक वर्ग foo है, और एक std :: मानचित्र का उपयोग करने के लिए कुछ बढ़ावा :: shared_ptrs स्टोर करने के लिए चाहते हैं, उदाहरण के लिए:बढ़ावा :: shared_ptr मानक कंटेनर

class foo; 

typedef boost::shared_ptr<foo> foo_sp; 
typeded std::map<int, foo_sp> foo_sp_map; 

foo_sp_map m; 

मैं के लिए एक नया foo_sp जोड़ते हैं नक्शा लेकिन कुंजी का उपयोग पहले से मौजूद है, क्या मौजूदा प्रविष्टि हटा दी जाएगी? उदाहरण के लिए:

foo_sp_map m; 

void func1() 
{ 
    foo_sp p(new foo); 
    m[0] = p; 
} 

void func2() 
{ 
    foo_sp p2(new foo); 
    m[0] = p2; 
} 

क्या मूल सूचक (पी) को पी 2 द्वारा प्रतिस्थापित किया जाएगा जब मुक्त किया जाएगा? मुझे यकीन है कि यह होगा, लेकिन मैंने सोचा कि यह पूछने/साझा करने लायक था।

+0

संशोधित प्रश्न - साझा_ptr को auto_ptr नहीं किया जाना चाहिए, – Rob

+0

यह "_have_" –

उत्तर

7

सबसे पहले, अपने प्रश्न शीर्षक को बढ़ावा देने :: auto_ptr कहते हैं, लेकिन आप वास्तव में बढ़ावा देने :: shared_ptr

और हाँ, मूल सूचक मुक्त हो जाएगा (यदि वहाँ आगे नहीं यह करने के लिए संदर्भ साझा कर रहे हैं) मतलब है।

0

चूंकि स्टैक ओवरफ्लो मुझे टिप्पणी करने की अनुमति नहीं देगा, मैं बस जवाब दूंगा। :/

मुझे "पी" गुंजाइश से बाहर नहीं दिख रहा है, इसलिए इसके द्वारा इंगित ऑब्जेक्ट मुक्त हो जाएगा। "पी" अभी भी इसे इंगित करेगा।

+0

है, मुझे यह स्पष्ट करना चाहिए कि पी 2 समय के निर्माण के समय से बाहर हो जाएगा। – Rob

+0

नए उपयोगकर्ताओं पर टिप्पणी करने पर प्रतिबंध नए उपयोगकर्ताओं को टिप्पणी करने से रोकना है, न कि आपको सिस्टम को रोकने के लिए प्रोत्साहित करना! –

1

यह क्या में अपने ... अनुभाग होता है जब आप पर अमल m[0] = p2;p की प्रतिलिपि है कि उस जगह में मूल रूप से था दायरे से बाहर चला जाता है

आपका कंटेनर वर्ग, प्रतियां foo_sp के उदाहरणों के शामिल पर निर्भर करता है। उस समय इसे हटा दिया जाएगा यदि कोई अन्य foo_sp संदर्भित नहीं है

यदि दूसरी पंक्ति foo_sp p(new foo); में घोषित की गई प्रतिलिपि अभी भी आसपास है तो स्मृति को हटाया नहीं जाएगा। एक बार सभी संदर्भों को हटा दिए जाने के बाद प्रविष्टि हटा दी जाएगी।