मैं मार्टिन सुंदर लगता है आपके प्रश्न का अच्छी तरह उत्तर देते हैं, यह बताते हुए कि क्या होता है और यह भी कुछ भी नहीं कि यह थोड़ा खतरनाक है और अत्यधिक सलाह नहीं है (वास्तव में ड्रैगन हो)। मुझे वैकल्पिक विकल्प प्रदान करके थोड़ा सा विस्तार करने दें: नए/हटाए जाने से बचने के लिए, और इसके बजाय आवंटक अवधारणा का उपयोग करें।
उदाहरण के लिए, यदि आप std :: vector को देखते हैं, तो आप देखते हैं कि यह किस प्रकार के स्टोर पर है, लेकिन आवंटक पर भी यह टेम्पलेट किया गया है। एक अनुरूप आवंटक लिखकर, आप वास्तव में नियंत्रित कर सकते हैं कि std :: vector आवंटित करता है और स्मृति को डी-आवंटित करता है। ध्यान दें कि यह कितना अच्छा और ढीला है यह है: स्मृति आवंटन पर पूर्ण नियंत्रण डालने में आपको कोई कठिनाई नहीं है, भले ही आप किसी भी मूल std :: वेक्टर स्रोत कोड को नहीं बदल सकते हैं।
आप पुस्तकालय बी एक विशिष्ट तरीके से आवंटन करना चाहते हैं, मैं क्या होता है:
- एक संभाजक कि जिस तरह से है कि std :: संभाजक करता संभाजक अवधारणा के अनुरूप लिखें।
- सुनिश्चित करें कि गतिशील स्मृति आवंटन का उपयोग करने वाले सभी वर्ग सीधे (जैसे उनके सदस्यों में से किसी एक के माध्यम से नहीं) आवंटक को जागरूक हैं।
- उन सभी वर्गों में टाइपपीफ टाइप करें ताकि वे डिफ़ॉल्ट रूप से आपके आवंटक का उपयोग कर सकें।
चरण 3 स्पष्ट करने के लिए, क्या मेरा मतलब है अपने पुस्तकालय का एक मूलभूत हेडर फाइल में कुछ इस तरह लिखना है:
template <class T>
using my_lib::vector = std::vector<T, my_lib::MyAllocator<T>>;
अब आप उपयोग कर सकते हैं '' वेक्टर '' अपने पुस्तकालय, कहीं जो एक सामान्य वेक्टर होगा लेकिन आपकी आवंटन योजना का उपयोग करेगा।
चरण 1 बहुत आसान (स्टेटलेस आवंटकों के लिए) से काफी मुश्किल हो सकता है (राज्य के आवंटकों के साथ कई गॉचा हैं)। चरण 2 के लिए, यह काफी सरल है जहां तक कंटेनर के लिए गतिशील स्मृति जाता है क्योंकि मानक लाइब्रेरी में सभी कंटेनर पहले से ही इसका समर्थन करते हैं। लेकिन यदि आप उदाहरण के लिए गतिशील स्मृति का उपयोग कर रहे हैं बहुरूपता, आपको एक आवंटक-जागरूक तरीके से ऐसा करने के लिए थोड़ा अतिरिक्त काम करना होगा (शायद एक उपयुक्त रैपर लिखें)।
अगर किसी के पास कारणों के अच्छे उदाहरण हैं कि आप आवंटकों का उपयोग करने के विरोध में नया/हटाना क्यों चाहते हैं (उदा। क्योंकि ऐसा कुछ है जो आप आवंटकों के साथ नहीं कर सकते हैं) तो मुझे उन्हें सुनना होगा।
संपादित करें: और सिर्फ इस पूर्ण सर्कल को लाने के लिए, ध्यान दें कि लाइब्रेरी ए और बी का उपयोग करके कोई समस्या नहीं होगी यदि आप ऐसा करते हैं, क्योंकि कोई वैश्विक ऑपरेटरों को ओवरराइड नहीं किया गया है।
आपके पास एक विशिष्ट उपयोग-मामला है? 'नया' और 'हटाएं' ओवरराइड किया जा सकता है, लेकिन इसके लिए क्या? या यह एक सैद्धांतिक प्रश्न है (जो कि बहुत उन्नत उपयोगकर्ताओं के लिए होगा और मुझे लगता है कि उपयोग करता है)? – Elyasin
गतिशील रूप से जुड़े पुस्तकालय मौजूद नहीं हैं, जहां तक मानक सी ++ का संबंध है, इसलिए आपका प्रश्न प्लेटफ़ॉर्म-विशिष्ट है। क्या आप एक विशिष्ट मंच में रूचि रखते हैं? –
@ सेबेस्टियन रेडल यूनिक्स से संबंधित, .so – nyarlathotep108