2010-09-13 8 views
9

क्षमा करें अगर इसका स्पष्ट रूप से उत्तर दिया गया है, लेकिन मैं बूस्ट प्रलेखन और लेखों द्वारा ऑनलाइन उलझन में थोड़ा उलझन में हूं।बूस्ट के साथ असाइनमेंट पर प्रश्न :: shared_ptr (बनाम रीसेट() फ़ंक्शन)

मुझे लगता है कि मैं एक shared_ptr भीतर स्मृति जारी करने के लिए (यह मानते हुए संदर्भ गिनती शून्य करने के लिए चला जाता है), जैसे रीसेट() फ़ंक्शन का उपयोग कर सकते हैं,

shared_ptr<int> x(new int(0)); 
x.reset(new int(1)); 

यह, मेरा मानना ​​है कि निर्माण में परिणाम होगा दो पूर्णांक वस्तुओं की, और इन दो पंक्तियों के अंत तक शून्य के बराबर पूर्णांक स्मृति से हटा दिया जाएगा।

लेकिन, क्या हुआ अगर मैं कोड की निम्न ब्लॉक का उपयोग करें: जाहिर है

shared_ptr<int> x(new int(0)); 
x = shared_ptr<int>(new int(1)); 

, अब * x == 1 सही है, लेकिन मूल पूर्णांक वस्तु जाएगा (शून्य के बराबर) स्मृति से हटा दिया या है किया मैंने उस स्मृति को लीक किया?

ऐसा लगता है कि यह असाइनमेंट ऑपरेटर का मुद्दा होगा जो साझा_प्टर की संदर्भ संख्या को कम करता है, लेकिन स्रोत कोड पर एक नज़र मेरे लिए प्रश्न को स्पष्ट नहीं करता है। उम्मीद है कि कोई और अनुभवी या जानकार मेरी मदद कर सकता है। अग्रिम में धन्यवाद।

उत्तर

15

प्रलेखन काफी स्पष्ट है:

shared_ptr & operator=(shared_ptr const & r); // never throws

प्रभाव: shared_ptr(r).swap(*this) के बराबर।

तो यह आपके द्वारा बनाई गई अस्थायी वस्तु के साथ स्वामित्व को स्वाइप करता है। अस्थायी तब समाप्त होता है, संदर्भ गणना घट जाती है। (और शून्य होने पर रोकना।)


इन कंटेनरों का उद्देश्य स्मृति को रिसाव नहीं करना है। तो नहीं, जब तक आप उद्देश्य पर चीजों को गड़बड़ करने की कोशिश नहीं कर रहे हैं, तब तक आपको चीजों को लीक करने की चिंता करने की आवश्यकता नहीं है। (दूसरे शब्दों में, आपको शायद बूस्ट को संदेह करने की आवश्यकता नहीं है कि वे क्या कर रहे हैं।)

+0

मैंने इसे देखा, लेकिन फिर मैंने अतिरिक्त जानकारी भी देखी जो संभावित रूप से विरोधाभासी था। सैनिटी चेक के लिए धन्यवाद। – RandomGuy

5

आपने स्मृति को लीक नहीं किया है। पहली int वस्तु के लिए स्मृति हटा दी जाएगी।