2008-12-18 7 views

उत्तर

16

सी ++ मानक इस <new> हैडर से नए ऑपरेटर की एक वस्तु प्रपत्र (प्रपत्र आमतौर पर इस्तेमाल किया) के बारे में क्या कहना है:

आवश्यक व्यवहार:

वापसी एक nonnull सूचक उपयुक्त रूप से करने के लिए गठबंधन भंडारण (3.7.3), या फिर bad_alloc अपवाद फेंक दें। यह आवश्यकता इस फ़ंक्शन के प्रतिस्थापन संस्करण पर बाध्यकारी है।

डिफ़ॉल्ट व्यवहार:

- एक पाश पर क्रियान्वित: पाश के भीतर, समारोह पहले अनुरोध किया भंडारण आवंटित करने के लिए प्रयास करता है। चाहे प्रयास में मानक सी लाइब्रेरी फ़ंक्शन मॉलोक को कॉल शामिल है, निर्दिष्ट नहीं है।

- प्रयास सफल होने पर आवंटित संग्रहण में एक सूचक लौटाता है। अन्यथा, यदि पर अंतिम तर्क है set_new_handler() एक शून्य सूचक था, bad_alloc फेंक दें।

- अन्यथा, फ़ंक्शन वर्तमान new_handler (18.4.2.2) को कॉल करता है। यदि बुलाया गया फ़ंक्शन लौटाता है, तो लूप दोहराता है।

- लूप समाप्त हो जाता है जब अनुरोधित संग्रहण आवंटित करने का प्रयास सफल होता है या जब नया_handler फ़ंक्शन वापस नहीं आता है।

मानक अन्य सामान का एक बहुत नया ऑपरेटर और गतिशील स्मृति आवंटन (एक भयंकर बहुत कहने के लिए) के बारे में कहने के लिए है, लेकिन मुझे लगता है कि "डिफ़ॉल्ट व्यवहार" सूची में नए ऑपरेटर की मूल बातें सार सुंदर कुंआ।

+1

बताकर कवर किया है कि ऑब्जेक्ट का आकार नए के साथ कैसे संग्रहीत किया जाता है। इसलिए पॉइंटर – yesraaj

+0

का उपयोग करके ऑब्जेक्ट को हटाने पर इसका उपयोग किया जा सकता है यह निश्चित रूप से कार्यान्वयन और इच्छा के लिए छोड़ा गया है प्लेटफार्मों के बीच अलग हो। – Anteru

+0

यह मानक द्वारा निर्दिष्ट नहीं है। आम तौर पर malloc() या कुछ इसी तरह का उपयोग किया जाएगा और स्मृति ब्लॉक का आकार उसी प्रकार की तकनीकों का उपयोग करके रखा जाएगा (या समान अगर malloc() का उपयोग किया जाता है)। –

0

यदि आप डिबगिंग के लिए ऐप बनाते हैं, तो यदि आप मेमोरी लीक डिटेक्टर का उपयोग कर रहे हैं, तो यदि आपके पास मेमोरी लीक डिटेक्टर का उपयोग हो रहा है, तो यदि आपके पास बोहेम कचरा कलेक्टर की तरह कुछ है, तो यह निर्भर करता है कि यह ओवरलोड हो गया है या नहीं, अंकन/अनमार्किंग बिट्स इत्यादि। यह अंदर बहुत सारी कस्टम चीजें कर सकता है, या बिल्कुल कुछ भी नहीं।

+0

मुझे लगता है कि उन्होंने "मानक" –

9

मैंने 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() { } को आकार को स्टोर करने के लिए जीसीसी बनाता है, भले ही हम किस डीलोकेशन फ़ंक्शन को लिखते हैं।

+0

क्या आप मेमोरी पूल को कार्यान्वित करते समय इस 'ऑपरेटर डिलीट []' आकार के सिंटैक्स को समझा सकते हैं, यानी आप http://stackoverflow.com/questions/2322742 के साथ मेरी मदद कर सकते हैं? धन्यवाद! – Tobias

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