c++ - Boost_ptr को बढ़ावा देने के साथ कस्टम(पूल) आवंटक




shared-ptr allocator (2)

जो भी आप चाहते हैं उसे करने के लिए कोड यहां दिया गया है (शायद संकलित नहीं होगा क्योंकि मेरे पास हाथ में वृद्धि नहीं है और मैं इसे स्मृति से लिख रहा हूं):

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();

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

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

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

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

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

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);
    }
};

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

मैं बूस्ट के पूल इंटरफ़ेस कहता हूं कि पूल से आवंटित किए जाने वाले साझा_प्टर द्वारा प्रबंधित ऑब्जेक्ट्स को यह कैसे प्राप्त किया जा सकता है?


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

जहां यह चिंतित है स्मृति की हटाने में अब संदर्भित नहीं है। यदि आपने डिफ़ॉल्ट ढेर के अलावा किसी अन्य चीज़ से आवंटित किया है तो आपको कस्टम डिलीटर प्रदान करने की आवश्यकता होगी





allocator