मैं जानता हूँ कि वहाँ काफी कुछ सी ++ पूछे जाने वाले प्रश्न (और यहां इतने पर जवाब) का कहना है कि अशक्त के लिए एक सादे नई अभिव्यक्ति की वापसी मान की जाँच करने की आवश्यकता नहीं है कि, सादे नए के बाद से -प्रदर्शन अपवाद फेंकने से असफलताओं को इंगित करता है। वे मूल रूप से बताते हैं कि सादा नई अभिव्यक्ति कभी वापस नहीं आती है। (तक "सादे नई अभिव्यक्ति" मैं एक नया अभिव्यक्ति है कि एक nothrow
एक नहीं है मतलब है)।उपयोगकर्ता-परिभाषित ऑपरेटर नए रिटर्न कि नल पॉइंटर
हालांकि, एक बहुत ही बुनियादी सवाल की तरह लग रही इस के बावजूद, मैं अचानक एहसास हुआ कि मुझे समझ नहीं आता क्या विशिष्ट मान्यताओं वे बनाने के (यदि हो तो) जब वे कहते हैं कि इस सवाल का जवाब दे।
विशेष रूप से, मुझे आश्चर्य है कि क्या मुझे ::operator new
के बुनियादी सादे रूप को हमेशा शून्य सूचकांक लौटने के लिए अधिभारित करने की अनुमति है, और इसलिए उम्मीद है कि उस ऑपरेटर का उपयोग करने वाले सभी सादे नए-अभिव्यक्ति अब शून्य पॉइंटर्स वापस आ जाएंगे।
भाषा विनिर्देश के अनुसार, यदि मेरा ::operator new
गैर-फेंकने के रूप में घोषित किया गया है, तो मैं एक शून्य सूचक लौटाकर स्मृति आवंटन विफलता को इंगित/कर सकता हूं। तो, चलिए बस
void *operator new(size_t s) throw() {
return 0;
}
int main() {
int *i = new int;
}
मेरे प्रयोगों में, उपर्युक्त नई अभिव्यक्ति सफलतापूर्वक शून्य सूचक लौटाती है। तो, क्या मैं उपरोक्त कोड में किसी भी नियम को तोड़ रहा हूं या नहीं? यह एक सादे ::operator new
के रूप में गैर फेंकने की घोषणा करने के कानूनी है?
और यदि उपरोक्त कोड ठीक है, तो मुझे लगता है कि जब कोई कहता है कि एक सादा नया "कभी शून्य सूचक नहीं देता है", तो वे यह मानते हैं कि ::operator new
का मानक-लाइब्रेरी-प्रदत्त संस्करण नहीं रहा है जगह ले ली। क्या यह धारणा सही है?
इस चर्चा के लिए एक और पहलू है - भले ही मानक आपको स्पष्ट रूप से 'nullptr'/'0' वापस लौटने की अनुमति देता है जैसा कि आपने कहा है, मानक पुस्तकालयों को' 0 'को संभालने के लिए आवश्यक हैं? मैं शर्त लगाता हूं कि वे नहीं हैं - और कार्यान्वयन नहीं करते हैं - इसलिए यह * अव्यवहारिक * होगा * एक प्रोग्राम लिखने के लिए ':: ऑपरेटर नई' वापसी 0। उदा। 20.8.9.1/4 को 'std :: आवंटित :: आवंटित' फेंक 'std :: bad_alloc' की आवश्यकता होती है यदि भंडारण प्राप्त नहीं किया जा सकता है - क्या यह (आमतौर पर अनावश्यक रूप से) शून्य के लिए जांच करेगा, या फेंकने के लिए' :: ऑपरेटर नया 'विश्वास करेगा? –
क्या 'नए' के गैर-फेंकने वाले संस्करण को एक अलग हस्ताक्षर की आवश्यकता नहीं है? 'शून्य * ऑपरेटर नया (std :: size_t आकार); 'एक शून्य सूचक वापस नहीं कर सकता है, इसे त्रुटि के मामले में फेंकना पड़ता है भले ही इसे फिर से परिभाषित किया गया हो। – user657267
मानक पुस्तकालय मानक निर्माण के लिए ':: नया टी' और ':: नया (static_cast (get_allocator() (1)) T' प्लेसमेंट के लिए उपयोग करेगा, और वे रूप हमेशा फेंकने आवंटन फ़ंक्शन का आह्वान करेंगे (भले ही वह बदल दिया गया है) –