2010-05-26 14 views
26

मैं एक shared_ptr द्वारा प्रबंधित वस्तुओं चाहते हैं के साथ संभाजक एक पूल से आवंटित किया जाना, बूस्ट के पूल इंटरफेस, यह कैसे प्राप्त किया जा सकता कहते हैं?कस्टम (पूल) को बढ़ावा देने shared_ptr

उत्तर

21

यहाँ आप क्या चाहते हैं (शायद संकलन नहीं होगा के रूप में मैं हाथ पर बढ़ावा नहीं है और मैं स्मृति से यह लिख रहा हूँ) करने के लिए कोड है दो अलग-अलग परियोजनाएं दोनों में, बना सकते हैं और नष्ट कार्यों सिंक्रनाइज़ कर रहे थे (आप संभाजक के उपयोग के चारों ओर एक boost::mutex ताला जोड़ सकते हैं) और वे एक कारखाने वर्ग के सदस्य थे (और destroy के हस्ताक्षर boost::bind के उपयोग के माध्यम void (YourClass*) को संशोधित किया गया था)।

आप बूस्ट :: shared_ptr कन्स्ट्रक्टर में object_pool<YourClass>::destroy बाध्यकारी द्वारा दो अतिरिक्त फ़ंक्शंस (destroy और create) लिखने से भी बच सकते हैं।

मैं भी यह सब अब लिखने के लिए :) आलसी हूँ।

संपादित (चले गए कोड का प्रारूपण के लिए यहां प्रवेश मेरा उत्तर टिप्पणी):

नष्ट समारोह के लिए बाध्य करने के लिए:

class ClassFactory 
{ 
    boost::object_pool<YourClass> allocator; 
public: 
    boost::shared_ptr<YourClass> create() 
    { 
     return boost::shared_ptr<YourClass>(
      allocator.construct(), 
      boost::bind(&ClassFactory::destroy, this, _1)); 
    } 

    void destroy(YourClass* pointer) 
    { 
     allocator.destroy(pointer); 
    } 
}; 

ClassFactoryshared_ptr तुलना में एक लंबी जीवन होना चाहिए (यदि ClassFactory उदाहरण हटा दी जाती है, इस सूचक shared_ptr उदाहरण के लिए पारित अमान्य हो जाएगा - और जब shared_ptr हटाता YourClass उदाहरण अपने अनुप्रयोग क्रैश)।

+0

धन्यवाद, यही वह है जिसे मैं ढूंढ रहा था। मुझे यह देखने में दिलचस्पी होगी कि फैक्ट्री क्लास का उपयोग करके यह कैसे किया जाता है, मुझे विनाश समारोह को बाध्य करने में समस्याएं आ रही हैं। – myahya

+0

क्या आप जानते हैं कि 'निर्माण' के लिए कोई तकनीकी कारण नहीं है या कोई तर्क नहीं ले रहा है? – inf

+0

मैंने हाल ही में एक टेम्पलेट पूल कक्षा के साथ कुछ ऐसा ही किया और इसके बारे में यहां लिखा: https://www.burgundywall.com/post/shared_pool – Kurt

1

ये लगभग ओर्थोगोनल चिंताएं हैं। shared_ptr ऑब्जेक्ट्स आवंटन में कोई भाग नहीं निभाता है।

कहाँ यह का संबंध है विलोपन स्मृति के नहीं रह गया है संदर्भित है। आप डिफ़ॉल्ट ढेर के अलावा और कुछ से आवंटित किया है, तो आप provide a custom deleter

+0

मैं यह समझ के रूप में, shared_ptr एक कस्टम संभाजक लेने के लिए परिभाषित किया जा सकता: <वर्ग वाई, वर्ग डी, वर्ग A> shared_ptr (वाई * पी, डी डी, ए क) 'टेम्पलेट;' सवाल क्या विकास के लिए चला जाता है, तो मैं बूस्ट के pool_alloc – myahya

+0

उपयोग करने के लिए संभाजक काउंटर वस्तु – philsquared

4

स्पष्ट समाधान करना होगा:

अपनी खुद की make_shared समारोह बनाएँ और बनाया shared_ptr के लिए इस विधि का उपयोग लागू। जो लोग नियम से निकलते हैं उन्हें दंडित किया जाएगा।

नोट:

वहाँ shared_ptr की भूमिका के साथ एक भ्रम हो रहा है। इसकी भूमिका आपके आवंटित की तुलना में स्मृति का प्रबंधन करना है, हालांकि ऐसा करने के लिए इसे अपने स्वयं के कुछ आवंटन (काउंटर और डिलीटर) की आवश्यकता होती है, इस प्रकार आप इसे उन लोगों के लिए आवंटित कर सकते हैं। में

class YourClass; // your data type, defined somewhere else 

boost::object_pool<YourClass> allocator; 

void destroy(YourClass* pointer) 
{ 
    allocator.destroy(pointer); 
} 

boost::shared_ptr<YourClass> create() 
{ 
    // usage of object_pool<??>::construct requires that you have a 
    // YourClass::YourClass(void) defined. If you need to pass arguments 
    // to the new instance, you need to do that separately. 
    // 
    // for example using a YourClass::Initialize(your,parameters,here) method 
    // before returning from this function 
    return boost::shared_ptr<YourClass>(allocator.construct(), &destroy); 
} 

// usage: 
boost::shared_ptr<YourClass> newObject = create(); 

मैं दो बार इस लागू किया,:

+2

के लिए है आप 'बढ़ावा ::' बढ़ावा देने :: pool_alloc' साथ allocate_shared' का उपयोग नहीं किया जा सका थे है? – dvide

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