2009-01-19 12 views
5

मैं बूस्ट के साझा पॉइंटर्स का उपयोग कर रहा हूं, और enable_shared_from_this इस पर साझा पॉइंटर लौटने में सक्षम हूं। कोड इस तरह दिखता है:shared_from_this में कमजोर_ptr_cast को बढ़ावा दें()

class foo : public boost::enable_shared_from_this<foo> 
{ 
    boost::shared_ptr<foo> get() 
    { 
    return shared_from_this(); 
    } 
} 

साझा_from_this एक weak_ptr_cast अपवाद क्यों फेंक देगा?

उत्तर

8

यदि आपने स्टैक पर foo घोषित किया है, तो फ़ू को कोई अन्य साझा पॉइंटर्स नहीं हैं। उदाहरण के लिए:

void bar() 
{ 
    foo fooby; 
    fooby.get(); 
} 

fooby.get() weak_ptr_cast अपवाद होगा।

इस के आसपास पाने के लिए, ढेर पर fooby घोषित:

void bar() 
{ 
    boost::shared_ptr<foo> pFooby = boost::shared_ptr<foo>(new foo()); 
    pFooby->get(); 
} 

एक और संभावना है कि आप shared_from_this उपयोग करने के लिए पहले निर्माता से किया जाता है, जो फिर से एक साझा सूचक है कि नहीं करता है लौटने की कोशिश करेंगे की कोशिश कर रहे है अभी तक अस्तित्व में नहीं है।

+1

कन्स्ट्रक्टर से 'shared_from_this()' को कॉल करना संभवतः * साझा करने के लिए 'shared_from_this()' के कारण का कारण है (मेरा मतलब है कि विकास के दौरान, निश्चित रूप से उत्पादन कोड में नहीं)। दुर्भाग्यवश सबसे अच्छा (केवल?) समाधान दो चरण के निर्माण का उपयोग करना प्रतीत होता है (इसके सभी दोषों के साथ)। –

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