विरासत कोड देखते हुए मैं निम्नलिखित कोडओवरलोडिंग ऑपरेटर नए और अपवाद शुद्धता
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
शून्य लौटाता है? मेरे कंपाइलर में यह चलता है (और सदस्य प्रारंभिक पर दुर्घटनाग्रस्त)। क्या यह मानक अच्छी तरह से परिभाषित व्यवहार है?
कन्स्ट्रक्टर को कॉल नहीं किया जाना चाहिए यदि 'ऑपरेटर नया' एक शून्य सूचक देता है, और फिर पूरी 'नई' अभिव्यक्ति एक शून्य सूचक वापस आ जाएगी। – Simple
यह सी ++ में स्वीकार्य व्यवहार है, लेकिन यदि क्लास में वर्चुअल टेबल या कन्स्ट्रक्टर है तो वे क्रैश हो जाएंगे जो परिवर्तनीय सदस्यों तक पहुंचने से पहले 'this == 0' का परीक्षण नहीं करता है। यह स्पष्ट रूप से सामान्य नहीं है और शायद इससे बचा जाना चाहिए। आप बस उस परिभाषा को हटाने की कोशिश कर सकते हैं और देखें कि क्या होता है ... –