2009-02-06 23 views
19
यहाँ

एक छोटा सा सवाल है पर एक निर्माता:कॉल एक पहले से ही आबंटित स्मृति

सी ++ का उपयोग करना, मैं एक स्मृति क्षेत्र पर एक निर्माता कि पहले से ही आवंटित किया जाता है कैसे फोन कर सकते हैं?

उत्तर

35

आप प्लेसमेंट नए कन्स्ट्रक्टर का उपयोग कर सकते हैं, जो एक पता लेता है।

Foo* foo = new (your_memory_address_here) Foo(); 

C++ FAQ lite या MSDN पर एक अधिक विस्तृत विवरण पर एक नजर डालें। यह सुनिश्चित करने के लिए आपको केवल एक चीज की आवश्यकता है कि स्मृति ठीक तरह से गठबंधन है (malloc किसी भी चीज़ के लिए ठीक तरह से गठबंधन की गई स्मृति को वापस करना है, लेकिन एसएसई जैसी चीजों से सावधान रहें जिन्हें 16 बाइट सीमाओं के लिए संरेखण की आवश्यकता हो सकती है)।

+3

किसी और के लिए जो इस पर ठोकर खा रहा है: मुझे यह काम करने से पहले 'शामिल करना होगा - जी ++ ने असफल "कोई मिलान करने वाली फ़ंक्शन" त्रुटियों का एक गुच्छा फेंक दिया यदि मैंने नहीं किया। [यह] (http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10) प्लेसमेंट नई (सी ++ एफएक्यू) पर जानकारी है जिसने मुझे इसे समझने में मदद की। –

6

ध्यान दें कि प्लेसमेंट new को आमंत्रित करने से पहले, आपको स्मृति पर विनाशक को कॉल करने की आवश्यकता है - कम से कम अगर ऑब्जेक्ट में या तो नॉनट्रिविअल डिस्ट्रक्टर है या इसमें सदस्य हैं।

वर्ग की एक वस्तु सूचक objFoo नाशक स्पष्ट रूप में कहा जा सकता है इस प्रकार है:

obj->~Foo(); 
+2

नियुक्ति को नया करने से पहले हमें नई आवंटित स्मृति पर विनाशक को क्यों कॉल करना चाहिए? मुझे यह नहीं मिला ... – Malkocoglu

+1

आपको आमतौर पर स्मृति नहीं मिलती है जिसे आवंटित किया गया है लेकिन प्रारंभ नहीं किया गया है। यदि यह वास्तव में आपको मिला है तो निश्चित रूप से * आपको * उस पर विनाशक नहीं कहना चाहिए। अन्य सभी मामलों के लिए, उस स्थान पर पहले से ही एक वस्तु है जिसे उचित तरीके से निपटान किया जाना चाहिए। –

+1

आप स्मृति को प्रारंभ नहीं करते हैं (जब तक आप सभी शून्यों को सेट करने का मतलब नहीं देते)। आप वस्तुओं को शुरू करते हैं। कुछ यादृच्छिक स्मृति पर कॉलिंग डीटीआर खराब है। केवल अगर आप वस्तुओं के कंटेनर कर रहे हैं तो यह dtor कॉल करने के लिए समझ में आता है। यदि इन ऑब्जेक्ट्स में खाली गैर वर्चुअल डॉटर है तो आपको इसे करने की ज़रूरत नहीं है। C12+ मानक के अनुसार –

2

नियुक्ति नए निर्माता स्वीकार किए जाते हैं जवाब ने उल्लेख किया संभाजक वर्ग हेडर में निर्धारित से पहले एक पुराने तरीका है। अब आपको वास्तव में करना चाहिए (सी ++ 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); 

यही है।

संबंधित मुद्दे