अन्य सभी चीजें क्या हैं new
ऑपरेटर स्मृति आवंटित करने और कन्स्ट्रक्टर को कॉल करने के अलावा अन्य करता है?सी ++ नया ऑपरेटर आवंटन और सीटीओआर कॉल के अलावा क्या करता है?
उत्तर
सी ++ मानक इस <new>
हैडर से नए ऑपरेटर की एक वस्तु प्रपत्र (प्रपत्र आमतौर पर इस्तेमाल किया) के बारे में क्या कहना है:
आवश्यक व्यवहार:
वापसी एक nonnull सूचक उपयुक्त रूप से करने के लिए गठबंधन भंडारण (3.7.3), या फिर bad_alloc अपवाद फेंक दें। यह आवश्यकता इस फ़ंक्शन के प्रतिस्थापन संस्करण पर बाध्यकारी है।
डिफ़ॉल्ट व्यवहार:
- एक पाश पर क्रियान्वित: पाश के भीतर, समारोह पहले अनुरोध किया भंडारण आवंटित करने के लिए प्रयास करता है। चाहे प्रयास में मानक सी लाइब्रेरी फ़ंक्शन मॉलोक को कॉल शामिल है, निर्दिष्ट नहीं है।
- प्रयास सफल होने पर आवंटित संग्रहण में एक सूचक लौटाता है। अन्यथा, यदि पर अंतिम तर्क है set_new_handler() एक शून्य सूचक था, bad_alloc फेंक दें।
- अन्यथा, फ़ंक्शन वर्तमान new_handler (18.4.2.2) को कॉल करता है। यदि बुलाया गया फ़ंक्शन लौटाता है, तो लूप दोहराता है।
- लूप समाप्त हो जाता है जब अनुरोधित संग्रहण आवंटित करने का प्रयास सफल होता है या जब नया_handler फ़ंक्शन वापस नहीं आता है।
मानक अन्य सामान का एक बहुत नया ऑपरेटर और गतिशील स्मृति आवंटन (एक भयंकर बहुत कहने के लिए) के बारे में कहने के लिए है, लेकिन मुझे लगता है कि "डिफ़ॉल्ट व्यवहार" सूची में नए ऑपरेटर की मूल बातें सार सुंदर कुंआ।
यदि आप डिबगिंग के लिए ऐप बनाते हैं, तो यदि आप मेमोरी लीक डिटेक्टर का उपयोग कर रहे हैं, तो यदि आपके पास मेमोरी लीक डिटेक्टर का उपयोग हो रहा है, तो यदि आपके पास बोहेम कचरा कलेक्टर की तरह कुछ है, तो यह निर्भर करता है कि यह ओवरलोड हो गया है या नहीं, अंकन/अनमार्किंग बिट्स इत्यादि। यह अंदर बहुत सारी कस्टम चीजें कर सकता है, या बिल्कुल कुछ भी नहीं।
मुझे लगता है कि उन्होंने "मानक" –
मैंने this उत्तर में यह क्या किया है इसका स्पष्टीकरण लिखा है। यह कैसे
new
स्मृतिnew
संभालती स्मृति विफलताnew
निर्माता अपवादnew
संभालती विशेष स्थान और nothrow संस्करणों
माइकल बताया कि कैसे डिफ़ॉल्ट संभाजक समारोह संभालती हो जाता है बताते हैं (:: ऑपरेटर नया) अच्छी तरह से स्मृति प्राप्त करता है और यह विफलता को कैसे संभालता है। मैंने आपका प्रश्न देखा है कि किसी ऑब्जेक्ट का आकार उसकी टिप्पणियों में कहां संग्रहीत किया जाता है। जवाब यह है कि अगर संग्रह नहीं किया जाता है तो आकार संग्रहित नहीं होता है।याद रखें कि सी free
के लिए आकार की जरूरत नहीं है (और :: ऑपरेटर नए बस malloc
उपयोग कर सकते हैं):
void * memory = malloc(x);
free (memory); // no need to tell it the size
यहाँ एक उदाहरण है जहाँ आप देखते हैं कि कैसे आकार के भंडारण के लिए आवंटन का आकार पर प्रभाव पड़ता है है सरणी एक नई अभिव्यक्ति के रूप (मेरे अन्य जवाब द्वारा कवर नहीं):
#include <cstddef>
#include <iostream>
struct f {
// requests allocation of t bytes
void * operator new[](std::size_t t) throw() {
void *p = ::operator new[](t);
std::cout << "new p: " << p << std::endl;
std::cout << "new size: " << t << std::endl;
return p;
}
// requests deleting of t bytes starting at p
void operator delete[](void *p, std::size_t t) throw() {
std::cout << "delete p: " << p << std::endl;
std::cout << "size : " << t << std::endl;
return ::operator delete[](p);
}
};
int main() {
std::cout << "sizeof f: " << sizeof (f) << std::endl;
f * f_ = new f[1];
std::cout << "&f_ : " << f_ << std::endl;
delete[] f_;
}
वह कुछ इस तरह बाहर प्रिंट होगा:
sizeof f: 1
new p: 0x93fe008
new size: 5
&f_ : 0x93fe00c
delete p: 0x93fe008
size : 5
एक byt ई वस्तु के लिए स्वयं और 4 बाइट्स गिनती के लिए जो ऑब्जेक्ट के आवंटित क्षेत्र से पहले संग्रहीत किया जाता है। ,
sizeof f: 1
new p: 0x9451008
new size: 1
&f_ : 0x9451008
delete p: 0x9451008
सी ++ क्रम यहाँ आकार के बारे में परवाह नहीं करता तो यह नहीं करता है: अब अगर हम एक आकार पैरामीटर के बिना आवंटन रद्द करने फ़ंक्शन का उपयोग करें (सिर्फ यह ऑपरेटर को नष्ट से निकालने), हम इस आउटपुट प्राप्त इसे अब स्टोर करें। ध्यान दें कि यह अत्यधिक कार्यान्वयन विशिष्ट है, और यही वह सदस्य है जो आपको सदस्य ऑपरेटर हटाने में आकार बताने में सक्षम होने के लिए करता है। अन्य कार्यान्वयन अभी भी आकार को स्टोर कर सकते हैं, और यदि कक्षा के लिए आह्वान करने वाला कोई विनाशक है तो सबसे अधिक संभावना होगी। उदाहरण के लिए, ऊपर दिए गए ~f() { }
को आकार को स्टोर करने के लिए जीसीसी बनाता है, भले ही हम किस डीलोकेशन फ़ंक्शन को लिखते हैं।
क्या आप मेमोरी पूल को कार्यान्वित करते समय इस 'ऑपरेटर डिलीट []' आकार के सिंटैक्स को समझा सकते हैं, यानी आप http://stackoverflow.com/questions/2322742 के साथ मेरी मदद कर सकते हैं? धन्यवाद! – Tobias
- 1. "नया" ऑपरेटर और "नया" फ़ंक्शन
- 2. ढेर पर स्मृति आवंटन के लिए नया ऑपरेटर
- 3. सी ++ नया ऑपरेटर - मेमोरी लेआउट
- 4. ऑपरेटर नया ओवरलोडिंग और संरेखण
- 5. सीटीओआर का क्या अर्थ है?
- 6. सी ++: नया कॉल जो कॉलोक की तरह व्यवहार करता है?
- 7. 'नया' ऑपरेटर
- 8. सी # में/= ऑपरेटर क्या करता है?
- 9. सी # == ऑपरेटर विस्तार से क्या करता है?
- 10. ^ऑपरेटर क्या करता है?
- 11. अल्पविराम ऑपरेटर क्या करता है?
- 12. सी ++ में ऑपरेटर -> * ऑपरेटर क्या है?
- 13. क्या सी # में नया ऑपरेटर बनाना संभव है?
- 14. सी ++ में कच्चे मेमोरी के ब्लॉक को आवंटित करने के लिए - "ऑपरेटर नया" या "ऑपरेटर नया []" का उपयोग करना है?
- 15. अल्पविराम ऑपरेटर क्या करता है?
- 16. असाइनमेंट ऑपरेटर कॉल कन्स्ट्रक्टर क्यों करता है?
- 17. >> ऑपरेटर सी # में क्या करता है?
- 18. यह गतिशील आवंटन क्या करता है?
- 19. मिक्सिंग ऑपरेटर नया [] और साधारण हटाने के साथ नया प्लेसमेंट []
- 20. क्या ऑपरेटर करता है '=>' सी # में क्या मतलब है?
- 21. कक्षा रचनाकारों में "सीटीओआर" क्या खड़ा है?
- 22. jQuery.Deferred() - "नया" ऑपरेटर वैकल्पिक है?
- 23. सी # '?' क्या है ऑपरेटर
- 24. अलग "ऑपरेटर नया []" रखने का क्या उद्देश्य है?
- 25. क्या सी # ऑपरेटर है?
- 26. सार्वजनिक ऑपरेटर नया, निजी ऑपरेटर हटाएं: नए
- 27. नया सी ++ 0x रावल्यू संदर्भ ऑपरेटर ओवरलोड
- 28. क्या सी के अल्पविराम ऑपरेटर के बराबर idiomatic सी # है?
- 29. नया ऑपरेटर जावास्क्रिप्ट में कैसे काम करता है?
- 30. ऑपरेटर()() परिभाषित करता है क्या?
बताकर कवर किया है कि ऑब्जेक्ट का आकार नए के साथ कैसे संग्रहीत किया जाता है। इसलिए पॉइंटर – yesraaj
का उपयोग करके ऑब्जेक्ट को हटाने पर इसका उपयोग किया जा सकता है यह निश्चित रूप से कार्यान्वयन और इच्छा के लिए छोड़ा गया है प्लेटफार्मों के बीच अलग हो। – Anteru
यह मानक द्वारा निर्दिष्ट नहीं है। आम तौर पर malloc() या कुछ इसी तरह का उपयोग किया जाएगा और स्मृति ब्लॉक का आकार उसी प्रकार की तकनीकों का उपयोग करके रखा जाएगा (या समान अगर malloc() का उपयोग किया जाता है)। –