2015-04-27 5 views
5

मेरा सवाल यह है कि साझा_ptr वर्ग से प्राप्त() सदस्य किस तरीके से उपयोग किए जा सकते हैं? और हम इसे हटाने के लिए का उपयोग क्यों नहीं कर सकते?shared_ptr कक्षा से get() सदस्य के उपयोग क्या हैं?

+4

जब आप प्रबंधित कच्चे सूचक तक पहुंच की आवश्यकता होती है तो आप 'get()' का उपयोग करते हैं। और यदि आप sp.get() को हटाते हैं, तो आप सबसे अधिक संभावना रखते हैं, और योग्यता से, अपरिभाषित व्यवहार प्राप्त करें – Praetorian

+1

एक एपीआई का उपयोग करने के लिए जिसमें कच्चे पॉइंटर्स –

+1

की आवश्यकता होती है, यह मुझे कई चंद्रमाओं की याद दिलाता है (boost :: shared_ptr से पहले) जब मैं अपना खुद का refcounted सूचक लुढ़का। मैंने कच्चे पॉइंटर एक्सेसर 'very_bad_public_method' – Gretchen

उत्तर

11

यदि आप एक समारोह एक कच्चे सूचक

void f(T *t); // non-owning pointer 

लेने के लिए किया था और आप एक T वस्तु के लिए एक स्मार्ट सूचक था, तो आप यह है कि कार्य करने के लिए ले जा रहा get()

std::shared_ptr<T> sp{new T}; // or unique_ptr 
//f(sp); // no good, type mismatch 
f(sp.get()); // passes the raw pointer instead 

एपीआई का उपयोग करके दे सकते हैं कच्चे पॉइंटर्स आम हैं, और अभी भी उपयोगी हैं। मेरा सुझाव है कि आप CppCon 2014 से this part of Herb Sutter's talk देखें, और शायद इसके आस-पास के हिस्सों।

आप चाहिए इस सूचक को हटाने के लिए नहीं प्रयास, स्मार्ट सूचक कक्षाएं, मान लेते हैं आप ऐसा कुछ नहीं करेंगे, और अभी भी अपने स्वयं के विनाशकर्ता में प्रबंधित वस्तु जब समय (सभी के बाद आता है मुक्त होगा कि यह कैसे होगा पता है कि आपने इसे हटा दिया है?)।

स्मार्ट पॉइंटर का काम ऑब्जेक्ट को प्रबंधित करना और सही समय पर इसे हटाना है, यदि आप ऑब्जेक्ट के जीवनकाल को मैन्युअल रूप से प्रबंधित करना चाहते हैं (आमतौर पर अनुशंसित नहीं) तो कच्चे सूचक का उपयोग करें।

यदि आप unique_ptr के स्वामित्व को मानना ​​चाहते हैं तो आप release() पर कॉल करके ऐसा कर सकते हैं।

+0

[बूस्ट भी उल्लेख] [http://www.boost.org/doc/libs/1_58_0/libs/smart_ptr/shared_ptr.htm#FAQ) नाम दिया है क्योंकि आप कस्टम डिलीटर का उपयोग कर सकते हैं साझा पॉइंटर्स के लिए, ऑब्जेक्ट को कच्चे सूचक के माध्यम से मुक्त करना मुश्किल नहीं है (भले ही यह विशिष्ट रूप से स्वामित्व में हो)। – dyp

4

आमतौर पर आप get() का उपयोग करेंगे जब आपको ऐसे पॉइंटर को स्वीकार करने वाले एपीआई को कच्चे सूचक को पास करने की आवश्यकता होती है।

shared_ptr कक्षा पॉइंटर के स्वामित्व का प्रबंधन करती है, इसलिए जब स्मार्ट पॉइंटर का जीवनकाल समाप्त होता है तो यह स्वचालित रूप से स्वामित्व वाली स्मृति को हटा देगा। यदि आप स्वयं को स्मृति को हटाने का प्रयास करते हैं तो shared_ptr डिलीकेट करने का प्रयास करता है, तो आप अपरिभाषित व्यवहार के साथ हवादार हो जाएंगे।

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