एक सी ++ परियोजना में खुदाई करते समय, मैंने सी ++ के new
ऑपरेटर का एक अजीब उपयोग का सामना करना पड़ा?अजीब सी ++ नए ऑपरेटर उपयोग
उत्तर
यह प्लेसमेंट नया वाक्यविन्यास है - यह आपको स्मृति में बिंदु-स्थान पर ऑब्जेक्ट बनाने की अनुमति देता है। ,
#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
new()
ऑपरेटर एक size
(बाइट्स में आकार) ले जा सकते हैं nothrow_value
या pointer
(पहले से ही आबंटित स्मृति में वस्तु का निर्माण (एक bad_alloc
अपवाद के बजाय एक नल पॉइंटर रिटर्न) इस सूचक द्वारा इंगित) तर्क, और उपयोग में आप वर्णन करते हैं कि यह arr
द्वारा इंगित स्मृति स्थान पर एक नई वस्तु बना रहा है। इस पर एक सभ्य गाइड के लिए मैं this link देखता हूं।
मामले में आप यह आगमन के लिए सूचक उपयोग कर रहा है में ClassA की अपनी नया उदाहरण बनाने के लिए उद्धृत।
इस वाक्य रचना 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
कि स्वचालित रूप से जादू करता है। आपको मेमोरी बफर का उपयोग करने वाली हर ऑब्जेक्ट को डिलीकेट नहीं करना चाहिए। इसके बजाय आपको प्रत्येक ऑब्जेक्ट को मैन्युअल रूप से नष्ट करना चाहिए, फिर [] केवल मूल बफर
मुझे लगता है कि आप प्रत्येक ऑब्जेक्ट को मैन्युअल रूप से नष्ट करना चाहते हैं और फिर मूल बफर को हटाएं, न कि दूसरी तरफ। –
@StuartGolodetz उस बेवकूफ गलती के लिए खेद है। इसे सही किया – jester
- 1. अजीब ऑपरेटर?: Decltype
- 2. सी # ऑपरेटर के साथ अजीब व्यवहार
- 3. अजीब परिणाम का उपयोग कर `==` ऑपरेटर
- 4. ओवरलोडेड सामान्य नए ऑपरेटर
- 5. सशर्त ऑपरेटर, अजीब व्यवहार
- 6. अजीब ऑपरेटर अधिभार व्यवहार?
- 7. अजीब व्यवहार जावा + = ऑपरेटर
- 8. सी # नए का उपयोग []
- 9. नए या नई [] ऑपरेटर
- 10. सार्वजनिक ऑपरेटर नया, निजी ऑपरेटर हटाएं: नए
- 11. 'ऑपरेटर नए': परिभाषा, विभिन्न लिंकेज (नए सिरे से परिभाषित नए ऑपरेटर पर _dllspec का प्रयोग करके)
- 12. जावा त्रिगुट ऑपरेटर अजीब व्यवहार
- 13. एसटीएल आवंटकों और ऑपरेटर नए []
- 14. अजीब सी ++ वाक्यविन्यास?
- 15. सी ++ में नए ऑपरेटर के साथ मेमोरी कैसे शुरू करें?
- 16. अजीब उपयोग
- 17. अजीब घोषणा (टेम्पलेट्स)। सी ++
- 18. सी # और जावा "नए" ऑपरेटर से परेशान क्यों हैं?
- 19. ऑपरेटर (- -)() ऑपरेटर सी #
- 20. अजीब ऑपरेटर ओवरलोडिंग, "ऑपरेटर टी एंड() स्थिरांक noexcept {वापसी * _ptr;}"
- 21. उपयोग नए ऑपरेटर एक सरणी आरंभ करने के लिए
- 22. अजीब ऑपरेटर प्राथमिकता के साथ ?? (नल कोलेसिंग ऑपरेटर)
- 23. अजीब व्यवहार: कार्यों के लिए टर्नरी ऑपरेटर
- 24. अजीब व्यवहार जब जावा त्रिगुट ऑपरेटर
- 25. ओवरलोडिंग ऑपरेटर नए और अपवाद शुद्धता
- 26. ऑपरेटर 'है' के साथ अजीब व्यवहार
- 27. जावास्क्रिप्ट ऑपरेटर "&&" इतना अजीब क्यों है?
- 28. वीबीनेट मिड बाएं ऑपरेटर विशेष (अजीब?) व्यवहार
- 29. पाइथन 'है' ऑपरेटर का अजीब व्यवहार अगर
- 30. सी ++ ऑपरेटर + और ऑपरेटर + = अधिभार
google "प्लेसमेंट नया" हटाएं या यह प्रश्न देखें: http://stackoverflow.com/questions/222557/what-uses-are-there-for -स्थापन-नया – Kos
@Askyane मैंने आपके संक्षिप्त उपयोग के लिए एक संक्षिप्त सारांश और एक लिंक शामिल किया है – GMasucci