मैं एक shared_ptr द्वारा प्रबंधित वस्तुओं चाहते हैं के साथ संभाजक एक पूल से आवंटित किया जाना, बूस्ट के पूल इंटरफेस, यह कैसे प्राप्त किया जा सकता कहते हैं?कस्टम (पूल) को बढ़ावा देने shared_ptr
उत्तर
यहाँ आप क्या चाहते हैं (शायद संकलन नहीं होगा के रूप में मैं हाथ पर बढ़ावा नहीं है और मैं स्मृति से यह लिख रहा हूँ) करने के लिए कोड है दो अलग-अलग परियोजनाएं दोनों में, बना सकते हैं और नष्ट कार्यों सिंक्रनाइज़ कर रहे थे (आप संभाजक के उपयोग के चारों ओर एक 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);
}
};
ClassFactory
shared_ptr
तुलना में एक लंबी जीवन होना चाहिए (यदि ClassFactory
उदाहरण हटा दी जाती है, इस सूचक shared_ptr
उदाहरण के लिए पारित अमान्य हो जाएगा - और जब shared_ptr
हटाता YourClass
उदाहरण अपने अनुप्रयोग क्रैश)।
ये लगभग ओर्थोगोनल चिंताएं हैं। shared_ptr
ऑब्जेक्ट्स आवंटन में कोई भाग नहीं निभाता है।
कहाँ यह का संबंध है विलोपन स्मृति के नहीं रह गया है संदर्भित है। आप डिफ़ॉल्ट ढेर के अलावा और कुछ से आवंटित किया है, तो आप provide a custom deleter
मैं यह समझ के रूप में, shared_ptr एक कस्टम संभाजक लेने के लिए परिभाषित किया जा सकता: <वर्ग वाई, वर्ग डी, वर्ग A> shared_ptr (वाई * पी, डी डी, ए क) 'टेम्पलेट;' सवाल क्या विकास के लिए चला जाता है, तो मैं बूस्ट के pool_alloc – myahya
उपयोग करने के लिए संभाजक काउंटर वस्तु – philsquared
स्पष्ट समाधान करना होगा:
अपनी खुद की 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();
मैं दो बार इस लागू किया,:
के लिए है आप 'बढ़ावा ::' बढ़ावा देने :: pool_alloc' साथ allocate_shared' का उपयोग नहीं किया जा सका थे है? – dvide
धन्यवाद, यही वह है जिसे मैं ढूंढ रहा था। मुझे यह देखने में दिलचस्पी होगी कि फैक्ट्री क्लास का उपयोग करके यह कैसे किया जाता है, मुझे विनाश समारोह को बाध्य करने में समस्याएं आ रही हैं। – myahya
क्या आप जानते हैं कि 'निर्माण' के लिए कोई तकनीकी कारण नहीं है या कोई तर्क नहीं ले रहा है? – inf
मैंने हाल ही में एक टेम्पलेट पूल कक्षा के साथ कुछ ऐसा ही किया और इसके बारे में यहां लिखा: https://www.burgundywall.com/post/shared_pool – Kurt