2014-09-25 6 views
5

मैं सी ++ 11 विशेषताओं, विशेष रूप से shared_ptr के बारे में सीख रहा हूं, और मुझे this का संदर्भ देने और अन्य वर्गों के संदर्भ के रूप में इसका उपयोग करने में कोई समस्या है।"this" को shared_ptr के रूप में संदर्भित करते हुए?

ऐसा करने का कारण यह है कि मेरे पास Simulation उदाहरण है जो सिमुलेशन (उदा। Apple) के अन्य उदाहरणों के आसपास पारित किया गया है ताकि वे स्वयं सिमुलेशन को संशोधित कर सकें, या सिमुलेशन से खुद को हटा सकें।

मेरे अधिक जटिल कोड में मुझे double free त्रुटि (जब प्रोग्राम मौजूद है) मिलता है, जैसा कि मैं from here समझता हूं कि मुझे एक ही कच्चे ऑब्जेक्ट पर shared_ptr दो बार नहीं बनाना चाहिए। thisApple ऑब्जेक्ट को shared_ptr के रूप में कैसे पास कर सकता है जब सिमुलेशन क्लास को यह नहीं पता कि this पहले से ही shared_ptr है?

मेरे सोचा initialisation बहस में shared_ptr पारित करने के लिए है, लेकिन है कि अनावश्यक प्रतीत, उदा .:

// The argument is a std::shared_ptr<Simulation> 
simulation->initSomethingElse(simulation); 

शायद मैं एक असामान्य पैटर्न में इस लागू करने के लिए कोशिश कर रहा हूँ, या हो सकता है मेरी समझ बहुत सही नहीं है? शायद इसके बजाय ऐसा करने का एक अच्छा तरीका है?

#include <memory> 

class Simulation; 

class Apple { 
public: 
    void init(std::shared_ptr<Simulation> simulation) { 
     this->simulation = simulation; 
    }; 

private: 
    std::shared_ptr<Simulation> simulation; 

}; 


class Simulation { 
public: 
    void initSomethingElse() { 
     auto apple = std::shared_ptr<Apple>(new Apple()); 

     // incorrect second reference to the raw pointer 
     apple->init(std::shared_ptr<Simulation>(this)); 
    }; 
}; 


int main() { 

    auto simulation = std::shared_ptr<Simulation>(new Simulation()); 
    simulation->initSomethingElse(); 

    return 0; 
} 
+0

आप 'shared_ptr ' उदाहरणों को कहां नष्ट कर रहे हैं? अकेले अंतिम वाक्य के लिए – Dai

उत्तर

8

पहली बात यह है कि मन में आता है का उपयोग करना है enable_shared_from_this: http://en.cppreference.com/w/cpp/memory/enable_shared_from_this

लेकिन दूसरी बात जो मन में आता है कि सिमुलेशन एप्पल के जीवनकाल प्रबंध किया जाना चाहिए, तो एप्पल जीवन का प्रबंधन करने की जरूरत नहीं सिमुलेशन का। इसलिए, आप बेहतर हैं कि ऐप्पल shared_ptr<Simulation> - केवल main() या कुछ उच्च स्तरीय फ़ंक्शन सिमुलेशन के जीवनकाल को प्रबंधित करना चाहिए।

यदि आप सावधान नहीं हैं तो आप चक्रीय संदर्भों के साथ समाप्त हो जाएंगे। मान लें कि सी ++ 11 में प्रत्येक सूचक एक साझा_प्टर होना चाहिए।

+0

+1 – James

1

उपयोग enable_shared_from_this तो वस्तु पर एक समारोह के लिए एक नया shared_ptr ही बना सकते हैं:

मैं नीचे एक सरल उदाहरण है। आप apple->init(std::shared_ptr<Simulation>(this)); लाइन के बजाय ऐसा करना चाहते हैं जो को Simulation पर दूसरा shared_ptr बनाता है। आप कहीं भी appleshared_ptr को हटाना या सहेजना चाहते हैं, क्योंकि वर्तमान में Apple केवल मौजूद है जबकि initSomethingElse() चल रहा है, जो बहुत उपयोगी प्रतीत नहीं होता है ...?

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