2010-09-02 12 views
13

कोई संक्षिप्त शब्दों में सारांशित कर सकता है कि कैसे बढ़ावा shared_from_this<>() स्मार्ट पॉइंटर का उपयोग किया जाना चाहिए, विशेष रूप से बाइंड फ़ंक्शन का उपयोग करके io_service में हैंडलर पंजीकृत करने के परिप्रेक्ष्य से।boost shared_from_this <>()

संपादित करें: कुछ प्रतिक्रियाओं ने अधिक संदर्भ के लिए कहा है। असल में, मैं "गॉथचास" की तलाश में हूं, इस तंत्र का उपयोग करके लोगों ने प्रतिद्वंद्वी व्यवहार को देखा है।

+1

आप वास्तव में क्या समझते नहीं हैं? एक अप्रत्यक्ष प्रश्न का उत्तर देना मुश्किल है। – GManNickG

+0

एकमात्र तरीका जिसे मैं उदाहरण का उदाहरण देने का प्रयास कर सकता था, कोड के रीम्स में पेस्ट करके था, जो कि बूस्ट कोड होने के नाते काफी घना है। –

उत्तर

30

मैंने जो सबसे बड़ा "गोचाचा" चलाया है वह यह है कि कन्स्ट्रक्टर से shared_from_this को कॉल करना अवैध है। यह सीधे नियम से चलता है कि साझा_from_this को कॉल करने से पहले ऑब्जेक्ट में shared_ptr मौजूद होना चाहिए।

+4

+1 अच्छी सलाह, आम तौर पर मैं अपना कन्स्ट्रक्टर प्रदान करता हूं और एक स्थिर 'shared_ptr बनाने' विधि प्रदान करता हूं। –

+2

मुझे लगता है कि आप का मतलब है कि आप अपना कन्स्ट्रक्टर निजी बनाते हैं। –

14

मेरी समझ से, कभी-कभी आपके कोड में आप कक्षा को shared_ptr स्वयं की पेशकश करना चाहते हैं ताकि आपके कोड के अन्य भाग इसे बनाए जाने के बाद आपकी कक्षा के किसी ऑब्जेक्ट में shared_ptr प्राप्त कर सकें।

समस्या यह है कि यदि आपकी कक्षा में सदस्य चर के रूप में स्वयं के लिए shared_ptr<> है, तो यह स्वचालित रूप से कभी भी नष्ट नहीं होगा, क्योंकि हमेशा "एक अंतिम संदर्भ" स्वयं के आसपास लटकता रहता है। enable_shared_from_this से विरासत में आपकी कक्षा एक स्वचालित विधि प्रदान करती है जो न केवल shared_ptr लौटाती है, बल्कि केवल सदस्य चर के रूप में एक कमजोर साझा पॉइंटर रखती है ताकि संदर्भ गणना को प्रभावित न किया जा सके। इस तरह, आपकी कक्षा सामान्य रूप से मुक्त हो जाएगी जब इसका अंतिम संदर्भ समाप्त हो जाएगा।

मैंने कभी इसका उपयोग नहीं किया है, लेकिन यह मेरी समझ है कि यह कैसे काम करता है।

8

shared_from_this<> एक वस्तु ही करने के लिए एक shared_ptr<> इशारा करने के लिए पहुंचना चाहती है, अगर प्रयोग किया जाता है।

आमतौर पर एक वस्तु केवल this पॉइंटर के बारे में जानता है, लेकिन किसी भी shared_ptr<> के प्रबंधन के बारे में नहीं। इसके अलावा, this आसानी से एक shared_ptr<> कि अन्य मौजूदा shared_ptr<> उदाहरणों के साथ स्वामित्व शेयरों में परिवर्तित नहीं किया जा सकता, इसलिए वहाँ एक वस्तु के लिए कोई आसान तरीका खुद के लिए एक वैध shared_ptr<> प्राप्त करने के लिए है।

shared_from_this<> इस समस्या को हल करने के लिए इस्तेमाल किया जा सकता। उदाहरण के लिए:

struct A : boost::enable_shared_from_this<A> { 
    server *io; 
    // ... 

    void register_self() { 
     io->add_client(shared_from_this()); 
    } 
}; 
5

boost::asio::io_servicedestructor प्रलेखन काफी अच्छी तरह से यह बताते हैं

विनाश अनुक्रम वर्णित ऊपर कार्यक्रमों परमिट shared_ptr <> का उपयोग करके उनके संसाधन प्रबंधन आसान बनाने के लिए। कहाँ एक वस्तु की जीवन भर एक कनेक्शन (या अतुल्यकालिक आपरेशन के कुछ अन्य अनुक्रम), एक shared_ptr वस्तु के जीवन से जुड़ा हुआ है उससे संबद्ध सभी अतुल्यकालिक के संचालन के लिए संचालकों में बाध्य किया जाएगा। के रूप में यह काम करता है इस प्रकार है:

  • जब एक भी कनेक्शन समाप्त होता है, सभी संबद्ध अतुल्यकालिक संचालन पूरा। संबंधित हैंडलर ऑब्जेक्ट्स नष्ट हो गए हैं, और ऑब्जेक्ट ऑब्जेक्ट्स के सभी साझा_ptr संदर्भ नष्ट हो गए हैं।
  • पूरे कार्यक्रम को बंद करने के लिए, io_service फ़ंक्शन स्टॉप() को कहा जाता है ताकि जितनी जल्दी हो सके किसी भी रन() कॉल को समाप्त कर सके।उपरोक्त परिभाषित io_service destructor सभी हैंडलर को नष्ट कर देता है, पर सभी साझा_ptr संदर्भों को नष्ट करने के लिए सभी कनेक्शन ऑब्जेक्ट्स नष्ट हो गए हैं।

आमतौर पर अपने वस्तुओं श्रृंखला अतुल्यकालिक संचालन जहां संचालकों boost::bind और boost::shared_from_this() का उपयोग कर सदस्य कार्यों के लिए बाध्य कर रहे हैं होगा। कुछ examples हैं जो इस अवधारणा का उपयोग करते हैं।

+0

आप उत्तर में अंततः मुझे उदाहरण के रूप में समझाया गया है ... विशेष रूप से क्या होता है यदि कनेक्शन में कोई त्रुटि है और http सर्वर उदाहरण asio से है। – Coyote21

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