एक छोटा सा सवाल है पर एक निर्माता:कॉल एक पहले से ही आबंटित स्मृति
सी ++ का उपयोग करना, मैं एक स्मृति क्षेत्र पर एक निर्माता कि पहले से ही आवंटित किया जाता है कैसे फोन कर सकते हैं?
एक छोटा सा सवाल है पर एक निर्माता:कॉल एक पहले से ही आबंटित स्मृति
सी ++ का उपयोग करना, मैं एक स्मृति क्षेत्र पर एक निर्माता कि पहले से ही आवंटित किया जाता है कैसे फोन कर सकते हैं?
आप प्लेसमेंट नए कन्स्ट्रक्टर का उपयोग कर सकते हैं, जो एक पता लेता है।
Foo* foo = new (your_memory_address_here) Foo();
C++ FAQ lite या MSDN पर एक अधिक विस्तृत विवरण पर एक नजर डालें। यह सुनिश्चित करने के लिए आपको केवल एक चीज की आवश्यकता है कि स्मृति ठीक तरह से गठबंधन है (malloc
किसी भी चीज़ के लिए ठीक तरह से गठबंधन की गई स्मृति को वापस करना है, लेकिन एसएसई जैसी चीजों से सावधान रहें जिन्हें 16 बाइट सीमाओं के लिए संरेखण की आवश्यकता हो सकती है)।
ध्यान दें कि प्लेसमेंट new
को आमंत्रित करने से पहले, आपको स्मृति पर विनाशक को कॉल करने की आवश्यकता है - कम से कम अगर ऑब्जेक्ट में या तो नॉनट्रिविअल डिस्ट्रक्टर है या इसमें सदस्य हैं।
वर्ग की एक वस्तु सूचक obj
Foo
नाशक स्पष्ट रूप में कहा जा सकता है इस प्रकार है:
obj->~Foo();
नियुक्ति को नया करने से पहले हमें नई आवंटित स्मृति पर विनाशक को क्यों कॉल करना चाहिए? मुझे यह नहीं मिला ... – Malkocoglu
आपको आमतौर पर स्मृति नहीं मिलती है जिसे आवंटित किया गया है लेकिन प्रारंभ नहीं किया गया है। यदि यह वास्तव में आपको मिला है तो निश्चित रूप से * आपको * उस पर विनाशक नहीं कहना चाहिए। अन्य सभी मामलों के लिए, उस स्थान पर पहले से ही एक वस्तु है जिसे उचित तरीके से निपटान किया जाना चाहिए। –
आप स्मृति को प्रारंभ नहीं करते हैं (जब तक आप सभी शून्यों को सेट करने का मतलब नहीं देते)। आप वस्तुओं को शुरू करते हैं। कुछ यादृच्छिक स्मृति पर कॉलिंग डीटीआर खराब है। केवल अगर आप वस्तुओं के कंटेनर कर रहे हैं तो यह dtor कॉल करने के लिए समझ में आता है। यदि इन ऑब्जेक्ट्स में खाली गैर वर्चुअल डॉटर है तो आपको इसे करने की ज़रूरत नहीं है। C12+ मानक के अनुसार –
नियुक्ति नए निर्माता स्वीकार किए जाते हैं जवाब ने उल्लेख किया संभाजक वर्ग हेडर में निर्धारित से पहले एक पुराने तरीका है। अब आपको वास्तव में करना चाहिए (सी ++ 11 शैली में):
allocator<Foo> alloc;
//Allocate memory for one or n objects
auto p = alloc.allocate(1);
//Construct an object of Foo on allocated memory block p, by calling one of Foo's constructors
alloc.construct(p, args, ...);
//OK, p now points to a Foo object ready for use...
//Call Foo's destructor but don't release memory of p
alloc.destroy(p);
//Release memory
alloc.deallocate(p, 1);
यही है।
किसी और के लिए जो इस पर ठोकर खा रहा है: मुझे यह काम करने से पहले 'शामिल करना होगा - जी ++ ने असफल "कोई मिलान करने वाली फ़ंक्शन" त्रुटियों का एक गुच्छा फेंक दिया यदि मैंने नहीं किया। [यह] (http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10) प्लेसमेंट नई (सी ++ एफएक्यू) पर जानकारी है जिसने मुझे इसे समझने में मदद की। –