मेरा सवाल यह है कि साझा_ptr वर्ग से प्राप्त() सदस्य किस तरीके से उपयोग किए जा सकते हैं? और हम इसे हटाने के लिए का उपयोग क्यों नहीं कर सकते?shared_ptr कक्षा से get() सदस्य के उपयोग क्या हैं?
उत्तर
यदि आप एक समारोह एक कच्चे सूचक
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()
पर कॉल करके ऐसा कर सकते हैं।
[बूस्ट भी उल्लेख] [http://www.boost.org/doc/libs/1_58_0/libs/smart_ptr/shared_ptr.htm#FAQ) नाम दिया है क्योंकि आप कस्टम डिलीटर का उपयोग कर सकते हैं साझा पॉइंटर्स के लिए, ऑब्जेक्ट को कच्चे सूचक के माध्यम से मुक्त करना मुश्किल नहीं है (भले ही यह विशिष्ट रूप से स्वामित्व में हो)। – dyp
आमतौर पर आप get()
का उपयोग करेंगे जब आपको ऐसे पॉइंटर को स्वीकार करने वाले एपीआई को कच्चे सूचक को पास करने की आवश्यकता होती है।
shared_ptr
कक्षा पॉइंटर के स्वामित्व का प्रबंधन करती है, इसलिए जब स्मार्ट पॉइंटर का जीवनकाल समाप्त होता है तो यह स्वचालित रूप से स्वामित्व वाली स्मृति को हटा देगा। यदि आप स्वयं को स्मृति को हटाने का प्रयास करते हैं तो shared_ptr
डिलीकेट करने का प्रयास करता है, तो आप अपरिभाषित व्यवहार के साथ हवादार हो जाएंगे।
- 1. स्थिर सदस्य फ़ंक्शन shared_ptr
- 2. कक्षा सदस्य
- 3. कक्षा के सदस्य
- 4. कक्षा के सदस्य फ़ंक्शन
- 5. क्या कक्षा में वर्चुअल डेटा सदस्य हो सकते हैं?
- 6. shared_ptr का उचित उपयोग?
- 7. दोस्त फ़ंक्शन का उपयोग करके, क्या हम कक्षा के निजी सदस्य को ओवरराइट कर सकते हैं?
- 8. क्या प्रत्येक सदस्य चर
- 9. PHP5। कक्षा सदस्य
- 10. कक्षा और उसके सदस्य
- 11. एक कक्षा :: unique_ptr सदस्य
- 12. मैं किसी सदस्य को shared_ptr कैसे बना सकता हूं?
- 13. कक्षा सदस्य समारोह सूचक
- 14. CoffeeScript कक्षा सदस्य
- 15. कक्षा के नाम के साथ डेटा सदस्य
- 16. क्या मुझे इसका उपयोग करने से पहले boost :: shared_ptr या std :: shared_ptr जांचना चाहिए?
- 17. PHP कक्षा के सदस्य और विधियां
- 18. कक्षा डिजाइन सवाल वर्ग के सदस्य कंटेनर
- 19. shared_ptr
- 20. पायथन में कक्षा के सदस्य चर का उपयोग करना?
- 21. टेम्पलेट सदस्य चर के साथ सी ++ कक्षा
- 22. क्या आप सी-स्टाइल सरणी के RAII के लिए shared_ptr का उपयोग कर सकते हैं?
- 23. shared_ptr का उपयोग करने के लिए, क्या यह सुरक्षित है?
- 24. कक्षा सदस्य प्रारंभिकरण के रूप में संदर्भ
- 25. क्या कक्षा के लिए केवल स्थैतिक क्षेत्र और विधियां हैं?
- 26. क्या आप मानचित्र के लिए कुंजी के रूप में boost :: shared_ptr का उपयोग कर सकते हैं?
- 27. कक्षा सहायकों के लिए अच्छे उपयोग क्या हैं?
- 28. बूस्ट के shared_ptr (shared_ptr <Y> कॉन्स एंड आर, टी * पी) के लिए क्या उपयोग किया जाता है?
- 29. क्या यह मध्यवर्ती व्युत्पन्न कक्षा संदर्भ से बेस क्लास सदस्य का उपयोग कर रहा है?
- 30. क्या GET विधि POST से तेज है?
जब आप प्रबंधित कच्चे सूचक तक पहुंच की आवश्यकता होती है तो आप 'get()' का उपयोग करते हैं। और यदि आप sp.get() को हटाते हैं, तो आप सबसे अधिक संभावना रखते हैं, और योग्यता से, अपरिभाषित व्यवहार प्राप्त करें – Praetorian
एक एपीआई का उपयोग करने के लिए जिसमें कच्चे पॉइंटर्स –
की आवश्यकता होती है, यह मुझे कई चंद्रमाओं की याद दिलाता है (boost :: shared_ptr से पहले) जब मैं अपना खुद का refcounted सूचक लुढ़का। मैंने कच्चे पॉइंटर एक्सेसर 'very_bad_public_method' – Gretchen