मैं एक 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
- 1. बढ़ावा shared_ptr और 'इस'
- 2. बढ़ावा :: shared_ptr मानक कंटेनर
- 3. जानबूझकर बढ़ावा को कैसे हटाएं :: shared_ptr?
- 4. बढ़ावा serialize और std :: shared_ptr
- 5. को बढ़ावा देने के लिए सिंगल हेडर फ़ाइल की आवश्यकता है :: shared_ptr
- 6. कितना बढ़ावा :: ~ shared_ptr काम करता है?
- 7. बढ़ावा :: shared_ptr और बताए व्युत्पन्न वर्ग
- 8. का उपयोग को बढ़ावा देने :: आवंटित ::
- 9. का उपयोग को बढ़ावा देने :: iterator
- 10. एक बढ़ावा देने के लिए .reset() का उपयोग :: एकमात्र स्वामित्व के साथ shared_ptr
- 11. का उपयोग को बढ़ावा देने, MATLAB के संस्करण
- 12. बढ़ावा दें :: shared_ptr <T> और बढ़ावा :: shared_ptr <const T> संदर्भ संख्या साझा करें?
- 13. सी ++ कक्षाओं के उदाहरणों को बढ़ावा देने के साथ पाइथन को पास करना :: पायथन
- 14. बढ़ावा देने serialization बनाम गूगल प्रोटोकॉल बफर?
- 15. भविष्य composability, और बढ़ावा देने :: wait_for_all
- 16. बढ़ावा :: ptr_container और std :: वेक्टर <shared_ptr>
- 17. विकसित C++ std :: नेमस्पेस को कैसे संभालें? उदाहरण: std :: tr1 :: shared_ptr vs. std :: shared_ptr बनाम boost :: shared_ptr बनाम boost :: tr1 :: shared_ptr
- 18. बढ़ावा देने के लिए अनिर्धारित संदर्भ :: टाइमर :: auto_cpu_timer
- 19. जेवीएम स्टार्टअप स्पीड को बढ़ावा देने का कोई तरीका?
- 20. का उपयोग करते हुए '-' को बढ़ावा देने :: program_options
- 21. :: थ्रेड को बढ़ावा देने के लिए तर्क कैसे पास करें?
- 22. पायथन को बढ़ावा देने के लिए सूचक तर्क
- 23. केवल आवश्यक मॉड्यूल को बढ़ावा देने के लिए कैसे?
- 24. std :: iterator की जोड़ी को बढ़ावा देने के लिए :: iterator_range
- 25. पार्स को बढ़ावा देने के साथ स्ट्रिंग उद्धृत :: भावना
- 26. संकलित को बढ़ावा देने के सी ++ 11 बजना मैक cstddef
- 27. पार्सिंग पायथन ग्रामर को बढ़ावा देने के साथ :: भावना - समस्या
- 28. यूनिक्स टाइमस्टैम्प को बढ़ावा देने के लिए :: posix_time :: ptime
- 29. आईपीसी को बढ़ावा देने वाला कोई अच्छा है?
- 30. किसी लाइब्रेरी को बढ़ावा देने का सामान्य उपयोग क्या है?
धन्यवाद, यही वह है जिसे मैं ढूंढ रहा था। मुझे यह देखने में दिलचस्पी होगी कि फैक्ट्री क्लास का उपयोग करके यह कैसे किया जाता है, मुझे विनाश समारोह को बाध्य करने में समस्याएं आ रही हैं। – myahya
क्या आप जानते हैं कि 'निर्माण' के लिए कोई तकनीकी कारण नहीं है या कोई तर्क नहीं ले रहा है? – inf
मैंने हाल ही में एक टेम्पलेट पूल कक्षा के साथ कुछ ऐसा ही किया और इसके बारे में यहां लिखा: https://www.burgundywall.com/post/shared_pool – Kurt