इसे placement new कहा जाता है। यह नई स्मृति आवंटित करने के बजाय निर्दिष्ट स्मृति पर निर्माता को कॉल करता है। ध्यान दें कि आवंटित स्मृति को मुक्त करने से पहले आपको इस मामले में स्पष्ट रूप से अपने ऑब्जेक्ट के विनाशक को कॉल करना होगा।
स्पष्टीकरण। मान लीजिए कि आपने कुछ कच्ची मेमोरी
char * rawMemory = new char [sizeof (Object)];
आवंटित की है और आप उस स्मृति पर एक ऑब्जेक्ट बनाना चाहते हैं। आप
new(rawMemory) Object(params);
अब फोन, स्मृति
delete [] rawMemory;
आप अपने विशिष्ट उदाहरण में वस्तु को स्पष्ट रूप से
reinterpret_cast<Object*>(rawMemory)->~Object();
की derstuctor फोन करना होगा, हालांकि, संभावित समस्या है मुक्त कराने से पहले कि आपने अपनी स्मृति में एक नया निर्माण करने से पहले मौजूदा ऑब्जेक्ट को सही तरीके से नष्ट नहीं किया है।
बोनस: कभी सोचा कैसे मानक std::vector
अपने निहित वस्तुओं डिफ़ॉल्ट-constructible किया जा रहा बिना कर सकता है? कारण यह है कि अधिकतर, यदि सभी नहीं, कार्यान्वयन allocator<T>
T* p
स्टोर नहीं करता है जिसके लिए p = new T[N]
के मामले में टी को डिफ़ॉल्ट-रचनात्मक होने की आवश्यकता होगी। इसके बजाए यह char
पॉइंटर - कच्ची मेमोरी संग्रहीत करता है, और p = new char[N*sizeof(T)]
आवंटित करता है। जब आप push_back
ऑब्जेक्ट करते हैं, तो यह उस चार सरणी में उपयुक्त पते पर प्रतिस्थापन के साथ कॉपी कन्स्ट्रक्टर को कॉल करता है।
स्रोत
2012-11-29 13:15:10
मौजूदा उत्तरों के विपरीत के रूप में: आपके प्रश्न के * शीर्षक * में वाक्यविन्यास मौजूद नहीं है! आप किसी भी मूल्य के साथ इस वाक्यविन्यास का उपयोग नहीं कर सकते हैं, आप इसे केवल कन्स्ट्रक्टर कॉल में उपयोग कर सकते हैं - यानी 'मान'' टी (तर्क) 'फ़ॉर्म का होना चाहिए। –
नियुक्ति नया हमेशा एक सी ++ मेमोरी पूल (ऑब्जेक्ट पूल) में उपयोग किया जाता है। अतिरिक्त उत्तर के रूप में। – Healer