2013-11-04 31 views
6

एक सी ++ परियोजना में खुदाई करते समय, मैंने सी ++ के new ऑपरेटर का एक अजीब उपयोग का सामना करना पड़ा?अजीब सी ++ नए ऑपरेटर उपयोग

+5

google "प्लेसमेंट नया" हटाएं या यह प्रश्न देखें: http://stackoverflow.com/questions/222557/what-uses-are-there-for -स्थापन-नया – Kos

+0

@Askyane मैंने आपके संक्षिप्त उपयोग के लिए एक संक्षिप्त सारांश और एक लिंक शामिल किया है – GMasucci

उत्तर

2

यह प्लेसमेंट नया वाक्यविन्यास है - यह आपको स्मृति में बिंदु-स्थान पर ऑब्जेक्ट बनाने की अनुमति देता है। ,

#include <new> 

... 

void *buffer = ::operator new(sizeof(X)); 
X *p = new (buffer) X; 
... 
p->~X(); 
::operator delete(buffer); 

बाद एक X धारण करने के लिए पर्याप्त स्मृति आवंटित करता है (उस में एक X निर्माण के बिना):

X *p = new X; 
... 
delete p; 

आप ऐसा करके ही प्रभाव को प्राप्त कर सकते हैं: नई के एक "सामान्य" उपयोग पर विचार करें फिर आवंटित स्मृति में X स्पष्ट रूप से बनाता है। बाद में, यह स्पष्ट रूप से बनाए गए X को नष्ट कर देता है और फिर उसमें मौजूद स्मृति को हटा देता है।

भी देखें सी ++ पूछे जाने वाले प्रश्न: http://www.parashift.com/c++-faq/placement-new.html

2

new() ऑपरेटर एक size (बाइट्स में आकार) ले जा सकते हैं nothrow_value या pointer (पहले से ही आबंटित स्मृति में वस्तु का निर्माण (एक bad_alloc अपवाद के बजाय एक नल पॉइंटर रिटर्न) इस सूचक द्वारा इंगित) तर्क, और उपयोग में आप वर्णन करते हैं कि यह arr द्वारा इंगित स्मृति स्थान पर एक नई वस्तु बना रहा है। इस पर एक सभ्य गाइड के लिए मैं this link देखता हूं।

मामले में आप यह आगमन के लिए सूचक उपयोग कर रहा है में ClassA की अपनी नया उदाहरण बनाने के लिए उद्धृत।

2

इस वाक्य रचना placement new वाक्य रचना कहा जाता है। यह आमतौर पर प्री-आवंटित बफर पर ऑब्जेक्ट बनाने के लिए उपयोग किया जाता है। मेमोरी पूल, कचरा कलेक्टर या बस जब प्रदर्शन और अपवाद सुरक्षा सर्वोपरि होती है तो यह उपयोगी होता है (स्मृति आवंटन विफलता का कोई खतरा नहीं है क्योंकि स्मृति पहले ही आवंटित कर दी गई है, और प्री-आवंटित बफर पर ऑब्जेक्ट का निर्माण करने में कम समय लगता है) ।

char *buf = new char[sizeof(string)]; // pre-allocated buffer 
string *s1 = new (buf) string("test1"); // placement new 
string *s2 = new string("test2"); //ordinary new 

यह आवंटन रद्द करने की बात आती है, वहाँ कोई placement delete कि स्वचालित रूप से जादू करता है। आपको मेमोरी बफर का उपयोग करने वाली हर ऑब्जेक्ट को डिलीकेट नहीं करना चाहिए। इसके बजाय आपको प्रत्येक ऑब्जेक्ट को मैन्युअल रूप से नष्ट करना चाहिए, फिर [] केवल मूल बफर

+2

मुझे लगता है कि आप प्रत्येक ऑब्जेक्ट को मैन्युअल रूप से नष्ट करना चाहते हैं और फिर मूल बफर को हटाएं, न कि दूसरी तरफ। –

+1

@StuartGolodetz उस बेवकूफ गलती के लिए खेद है। इसे सही किया – jester

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