2013-07-14 5 views
7

मुझे पता है कि प्लेसमेंट को नया बनाकर बनाए गए चर पर कॉल करना और फिर स्मृति के उस ब्लॉक तक पहुंचने से व्यवहार को अपरिभाषित किया गया है।प्लेसमेंट पर हटाएं

int* x = new int[2]; 
char* ch = new(x) char(); 
*ch = 't'; 
delete ch; 

लेकिन स्मृति के ब्लॉक, ढेर के बजाय ढेर पर आवंटित किया जाता है और फिर हम उस चर पर हटाकर बाद में स्मृति का उपयोग कहते हैं, मैं एक अपवाद है कि ब्लॉक प्रकार अमान्य है मिलता है।

int x[2]; 
char* ch = new(x) char(); 
*ch = 't'; 
delete ch; 

तो प्रश्नों की सूची है:

  • एक ढेर पर हटाना के फोन की वजह से अपवाद है?
  • क्या स्टैक पर मेमोरी ब्लॉक पर प्लेसमेंट नया उपयोग करना ठीक है?
  • यदि हां तो मैं चरित्र सूचक को कैसे हटाऊंगा।
  • प्लेसमेंट नया का उपयोग कर मेमोरी के एक ब्लॉक पर एकाधिक चर असाइन करना संभव है?
+1

http://www.parashift.com/c++-faq/placement-new.html – Drax

उत्तर

16

क्या स्टैक पर हटाने की कॉल के कारण अपवाद है?

हां। हालांकि थोड़ा सा स्पष्ट करने के लिए, यह एक सी ++ अपवाद नहीं है। यह एक त्रुटि है जिसे रनटाइम द्वारा पता चला है। यदि रनटाइम स्मार्ट नहीं है, तो आप अपरिभाषित व्यवहार में भी भाग सकते हैं।

क्या स्टैक पर मेमोरी ब्लॉक पर प्लेसमेंट नया उपयोग करना ठीक है?

हां। आप alloca() और Variable-length arrays (VLA) पर भी एक नज़र डालेंगे - ये स्टैक पर स्मृति आवंटित करने के एक और दो तंत्र हैं। ध्यान दें कि वीएलए सी 99 का हिस्सा है और सी ++ 11 (और पहले) मानक नहीं है, लेकिन अधिकांश उत्पादन-ग्रेड कंपाइलर्स द्वारा विस्तार के रूप में समर्थित है (यह सी ++ 14 में दिखाई दे सकता है)।

यदि हां तो मैं चरित्र सूचक को कैसे हटाऊंगा।

आपको नहीं करना चाहिए। जब आप किसी प्लेसमेंट का उपयोग करते हैं, तो आप delete पर कॉल नहीं करते हैं, तो आप बस एक विनाशक का आह्वान करते हैं। किसी भी दिए गए ऑब्जेक्ट o प्रकार T के लिए आपको delete o; के बजाय o->~T(); पर कॉल करने की आवश्यकता है। हालांकि, आपको उस ऑब्जेक्ट पर delete या delete [] पर कॉल करने वाले कोड से निपटना होगा, तो आपको ऑपरेटर delete और delete[] ओवरलोड करने की आवश्यकता हो सकती है और उन ऑपरेटरों को कुछ भी नहीं करना चाहिए (विनाशक पहले से ही उस बिंदु पर भाग गया है)।

क्या नियुक्ति नया उपयोग करके स्मृति के एक ब्लॉक पर एकाधिक चर असाइन करना संभव है?

हां। हालांकि, आपको यह सुनिश्चित करने के लिए अतिरिक्त देखभाल करने की आवश्यकता है कि आप alignment requirements से मिलें।

+0

एक अच्छा जवाब। लेकिन सिर्फ 1 स्पष्टीकरण।एक स्टैक पर प्लेसमेंट का उपयोग करते समय, शुरुआत से शुरू की गई स्मृति आवंटित होती है और फिर आगे बढ़ती है या यह यादृच्छिक रूप से दिए गए ब्लॉक में स्मृति आवंटित करती है। ऐसा लगता है कि पहला विकल्प सही है। अगर मैं गलत हूं तो मुझे सही करें – Saksham

+0

@ सक्षम: नियुक्ति नया किसी भी स्मृति को आवंटित नहीं करता है। यह एक तर्क के रूप में निर्दिष्ट स्मृति का उपयोग करता है। इस बात के लिए कि कैसे ढेर पर स्मृति आवंटित की जाती है - यह वास्तुकला पर निर्भर करता है, यह अंदर या बाहर बढ़ रहा है। हालांकि, स्टैक पर किसी भी ऑब्जेक्ट का मूल पता कम होगा, इसलिए यदि आप 'प्लेसमेंट नई []' के साथ कई ऑब्जेक्ट्स रखना चाहते हैं, तो उनके लिए स्मृति आवंटित करें। –

+0

"स्मृति आवंटित" के लिए गलत भाषा के लिए मेरा बुरा। यह "स्मृति का उपयोग किया जाना चाहिए" – Saksham

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