2011-04-15 12 views
7

साथ scoped_ptr/scoped_array मैं कैसे scoped_ptr या scoped_array एक कस्टम Deleter उपयोग करने के लिए प्राप्त करने के लिए नहीं दिख रहा है। शायद एक और कार्यान्वयन है जो साझा_ptr के समान नियंत्रित विलोपन की अनुमति देता है?बूस्ट कस्टम Deleter

Btw, क्यों shared_ptr कस्टम Deleter लेकिन scoped_ptr अनुमति नहीं देता है? बस उत्सुक।

उत्तर

5

मैं कैसे scoped_ptr या scoped_array कस्टम Deleter

आप नहीं कर सकते हैं उपयोग करने के लिए प्राप्त करने के लिए नहीं दिख रहा है।

शायद एक और कार्यान्वयन है जो shared_ptr के समान नियंत्रित विलोपन की अनुमति देता है?

यदि आपका कंपाइलर रैवल्यू संदर्भों का समर्थन करता है और आपके मानक लाइब्रेरी कार्यान्वयन std::unique_ptr लागू करता है, तो आप इसका उपयोग कर सकते हैं।

अन्यथा, boost::scoped_ptr कार्यान्वयन बहुत सरल है। The latest version सरल कोड की 100 से कम लाइनों से कम है। अपने स्वयं के व्युत्पन्न को बनाना बहुत आसान होगा जिसमें एक कस्टम डिलीटर होता है (या तो एक टेम्पलेट पैरामीटर के माध्यम से स्थिर या रनटाइम पर प्रदान किए गए फ़ंक्शन या फ़ैक्टर के माध्यम से गतिशील)।

+2

scoped_ptr सरल है, लेकिन नियंत्रित हटाने को सक्षम करना सीधा नहीं होगा। Shared_ptr जितना जटिल नहीं है, लेकिन फिर भी यदि लाइब्रेरी समाधान उपलब्ध है तो मैं इसे कोड नहीं करना चाहूंगा। – pic11

1

scoped सूचक और scoped सरणी का एक और कार्यान्वयन क्यूटी

में

http://doc.qt.io/qt-5/qscopedpointer.html

यह कस्टम Deleter के लिए अनुमति देता है पाया जाता है।

+0

विभिन्न कस्टम डिलीटर विभिन्न सूचक प्रकार बनाते हैं, लेकिन सामान्य प्रतिनिधियों का उपयोग करने से कार्यान्वयन सरल होना चाहिए। – pic11

+0

मुझे एक और कार्यान्वयन नहीं पता है जो सरल है। क्या आप कृपया एक दे देंगे? –

+0

मेरा मतलब था कि क्यूटी का कार्यान्वयन सामान्य :: प्रतिनिधियों जैसे बूस्ट :: फ़ंक्शन का उपयोग करने से सरल होना चाहिए। प्रदर्शन भी बेहतर होना चाहिए। लेकिन आप बूस्ट :: फ़ंक्शन <> का उल्लेख करने के लिए प्रत्येक अलग डिलीटर प्रकारों (डिलीटर टेम्पलेट पैरामीटर) – pic11

3

scoped_ptr कस्टम डिलीटर की अनुमति नहीं देता है। जैसा कि मुझे लगता है कि मुख्य कारण यह है कि इसका आकार sizeof(T*) के बराबर नहीं होगा यदि यह boost::function<>shared_ptr करता है।

मुझे लगता है कि सबसे पोर्टेबल विकल्प shared_ptr का उपयोग करना है या अपना खुद का scoped_ptr लिखना है जो डेलेटर्स का समर्थन करेगा।

+0

+1 के लिए अलग-अलग सूचक प्रकारों के साथ समाप्त होते हैं। – pic11

+3

unique_ptr एक कस्टम डिलीटर की अनुमति देता है, और यदि वह कस्टम डिलीटर एक "खाली" वर्ग है (जैसा कि डिफ़ॉल्ट डिलीटर है), तो sizeof (unique_ptr) == sizeof (T *)। –

3

आप बूस्ट :: check_delete फ़ंक्शन को ओवरलोड कर सकते हैं, उदा।

namespace boost { 

template<> 
void checked_delete (Foo* x) 
{ 
    .... 
} 

} // namespace boost 

ओवरलोडिंग के बाद, scoped_ptr हटाए जाने के बजाय check_delete को कॉल करेगा।

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