सी ++ 2003 में आवंटक मॉडल टूटा हुआ है और वास्तव में कोई उचित समाधान नहीं है। सी ++ 2011 के लिए आवंटक मॉडल तय किया गया था और आपके पास प्रति आवंटित आवंटक हो सकते हैं जो निहित वस्तुओं तक प्रचारित होते हैं (जब तक, निश्चित रूप से, आप उन्हें प्रतिस्थापित करना नहीं चुनते)। आम तौर पर, इसके लिए उपयोगी होने के लिए आप शायद गतिशील रूप से पॉलीमोर्फिक आवंटक प्रकार का उपयोग करना चाहते हैं जो डिफ़ॉल्ट std::allocator<T>
होने की आवश्यकता नहीं है (और आम तौर पर मैं अपेक्षा करता हूं कि यह गतिशील रूप से बहुरूप नहीं हो सकता है हालांकि यह बेहतर कार्यान्वयन विकल्प हो सकता है)। हालांकि, [लगभग] मानक सी ++ लाइब्रेरी में सभी कक्षाएं जो मेमोरी आवंटन करती हैं वे टेम्पलेट्स हैं जो आवंटक प्रकार को टेम्पलेट तर्क के रूप में लेते हैं (उदाहरण के लिए आईओएसट्रीम एक अपवाद है लेकिन आमतौर पर वे आवंटन समर्थन जोड़ने वाले वारंट को स्मृति की कोई भी रोचक राशि आवंटित नहीं करते हैं)।
आपकी कई टिप्पणियों में आप जोर दे रहे हैं कि आवंटकों को प्रभावी रूप से वैश्विक होने की आवश्यकता है: यह निश्चित रूप से सही नहीं है। प्रत्येक आवंटक-जागरूक प्रकार आवंटित आवंटक की एक प्रति संग्रहीत करता है (कम से कम, यदि उसके पास कोई आवृत्ति स्तर डेटा है; यदि ऐसा नहीं है तो स्टोर करने के लिए कुछ भी नहीं है उदाहरण के लिए operator new()
और operator delete()
का उपयोग कर डिफ़ॉल्ट आवंटक के साथ मामला) । इसका प्रभावी अर्थ यह है कि किसी ऑब्जेक्ट को दी गई आवंटन तंत्र को तब तक चिपकने की आवश्यकता होती है जब तक इसका उपयोग करने वाला कोई सक्रिय आवंटक न हो। यह वैश्विक ऑब्जेक्ट का उपयोग करके किया जा सकता है लेकिन यह भी उदाहरण का उपयोग करके किया जा सकता है। रेफरेंस गिनती या ऑब्जेक्टर्स को उस ऑब्जेक्ट के साथ संबद्ध करना जिसमें सभी ऑब्जेक्ट्स दिए गए हैं। उदाहरण के लिए, यदि प्रत्येक "दस्तावेज़" (एक्सएमएल, एक्सेल, पेज, जो भी संरचना फाइल सोचता है) अपने सदस्यों को एक आवंटक पास करता है, तो आवंटक दस्तावेज़ के सदस्य के रूप में रह सकता है और जब इसकी सभी सामग्री नष्ट हो जाती है तो दस्तावेज़ नष्ट हो जाता है । आवंटक मॉडल के इस भाग को पूर्व-सी ++ 2011 कक्षाओं के साथ काम करना चाहिए, जब तक कि वे एक आवंटन तर्क भी लेते हैं। हालांकि, पूर्व-सी ++ 2011 कक्षाओं में आवंटक निहित वस्तुओं को पारित नहीं किया जाएगा। उदाहरण के लिए, यदि आप std::vector<std::string>
पर आवंटक देते हैं तो C++ 2011 संस्करण std::string
एसपर आवंटित आवंटक का उपयोग करके std::string
एस के साथ सौदा करने के लिए उचित रूप से परिवर्तित किया जाएगा।यह प्री-सी ++ 2011 आवंटकों के साथ नहीं होगा।
वास्तव में उपप्रणाली में आवंटकों का उपयोग करने के लिए आपको प्रभावी रूप से उन्हें अपने कार्यों और/या कक्षाओं के लिए तर्क के रूप में स्पष्ट रूप से पारित करने की आवश्यकता होगी या स्पष्ट रूप से आवंटक-जागरूक वस्तुओं के माध्यम से संदर्भ के रूप में कार्य किया जाएगा। उदाहरण के लिए, यदि आप संदर्भित किसी भी मानक कंटेनर का उपयोग [संदर्भ] के संदर्भ में करते हैं, तो आप get_allocator()
विधि का उपयोग करके प्रयुक्त आवंटक प्राप्त कर सकते हैं।
स्रोत
2012-03-18 23:15:08
आवंटन को वैश्विक क्यों होना चाहिए? जब तक प्रत्येक आवंटित इकाई के अपने आवंटकों का संदर्भ होता है ताकि इसे सही ढंग से मुक्त किया जा सके, क्या इससे कोई फर्क नहीं पड़ता कि आवंटक वास्तव में कहां है? –
आवंटित इकाई के लिए आवंटक कहां छोड़ देगा? ऐसा लगता है कि यह वैश्विक होना चाहिए। – chadb