2013-10-31 15 views
5

विरासत कोड देखते हुए मैं निम्नलिखित कोडओवरलोडिंग ऑपरेटर नए और अपवाद शुद्धता

void* legacy_type::operator new(size_t size) { 
    return pool_alloc(size); 
} 

pool_alloc फेंक और विफलता के मामले में 0 वापस कभी नहीं करने के लिए जाना जाता है के लिए इसी तरह कुछ पाया।

यहां नए के std :: nothrow संस्करण के लिए कोई अधिभार नहीं है।

मुझे आश्चर्य है कि यह कोड semantically सही है और अच्छी तरह से परिभाषित व्यवहार है।

new (std::nothrow) legacy_type; कस्टम pool_alloc का उपयोग करना चाहिए? मेरे कंपाइलर में यह बिल्कुल संकलित नहीं करता है। क्या यह अच्छी तरह से परिभाषित व्यवहार है?

this==0 के कारण कन्स्ट्रक्टर रन और क्रैश होना चाहिए यदि ओवरलोड operator new शून्य लौटाता है? मेरे कंपाइलर में यह चलता है (और सदस्य प्रारंभिक पर दुर्घटनाग्रस्त)। क्या यह मानक अच्छी तरह से परिभाषित व्यवहार है?

+0

कन्स्ट्रक्टर को कॉल नहीं किया जाना चाहिए यदि 'ऑपरेटर नया' एक शून्य सूचक देता है, और फिर पूरी 'नई' अभिव्यक्ति एक शून्य सूचक वापस आ जाएगी। – Simple

+0

यह सी ++ में स्वीकार्य व्यवहार है, लेकिन यदि क्लास में वर्चुअल टेबल या कन्स्ट्रक्टर है तो वे क्रैश हो जाएंगे जो परिवर्तनीय सदस्यों तक पहुंचने से पहले 'this == 0' का परीक्षण नहीं करता है। यह स्पष्ट रूप से सामान्य नहीं है और शायद इससे बचा जाना चाहिए। आप बस उस परिभाषा को हटाने की कोशिश कर सकते हैं और देखें कि क्या होता है ... –

उत्तर

1

1) नहीं, यह नहीं होना चाहिए। ये अलग-अलग कार्य हैं। और, जब आप संचालन में से एक को अधिभारित करते हैं - यदि वे ओवरलोड नहीं होते हैं, तो अन्य सभी ऑपरेशंस कभी काम नहीं करेंगे, क्योंकि क्लास-स्कोप में operator new है और हस्ताक्षर स्वीकार्य नहीं है, तो कंपाइलर वैश्विक operator new की खोज नहीं करेगा, इसलिए संकलित करें आतंक हो जाएगा।

2) यदि आप new शून्य सूचक लौटाएंगे तो आप पोस्टकंडिशन तोड़ेंगे। n3376 18.6.1.1/3

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

आप रिटर्न 0 चाहते हैं, आप यदि आप इसे से अधिक भार और रिटर्न 0 का उपयोग हस्ताक्षर

void* operator new(size_t) throw() 

निम्नलिखित का उपयोग करना चाहिए, वहाँ कोई SEG गलती है।

n3376 5.3.4/13

आवंटन समारोह अशक्त देता है, तो प्रारंभ नहीं किया जाएगा, आवंटन रद्द करने समारोह बुलाया नहीं किया जाएगा, और नए-अभिव्यक्ति के मूल्य अशक्त होगा।

+0

मैं देखता हूं, "शून्य नहीं" स्पष्ट रूप से मानक में कहा गया है, धन्यवाद। – Muxecoid

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