2008-09-26 11 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); में घोषित की गई प्रतिलिपि अभी भी आसपास है तो स्मृति को हटाया नहीं जाएगा। एक बार सभी संदर्भों को हटा दिए जाने के बाद प्रविष्टि हटा दी जाएगी।

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