2014-10-29 6 views
5

मैं जानता हूँ कि वहाँ काफी कुछ सी ++ पूछे जाने वाले प्रश्न (और यहां इतने पर जवाब) का कहना है कि अशक्त के लिए एक सादे नई अभिव्यक्ति की वापसी मान की जाँच करने की आवश्यकता नहीं है कि, सादे नए के बाद से -प्रदर्शन अपवाद फेंकने से असफलताओं को इंगित करता है। वे मूल रूप से बताते हैं कि सादा नई अभिव्यक्ति कभी वापस नहीं आती है। (तक "सादे नई अभिव्यक्ति" मैं एक नया अभिव्यक्ति है कि एक nothrow एक नहीं है मतलब है)।उपयोगकर्ता-परिभाषित ऑपरेटर नए रिटर्न कि नल पॉइंटर

हालांकि, एक बहुत ही बुनियादी सवाल की तरह लग रही इस के बावजूद, मैं अचानक एहसास हुआ कि मुझे समझ नहीं आता क्या विशिष्ट मान्यताओं वे बनाने के (यदि हो तो) जब वे कहते हैं कि इस सवाल का जवाब दे।

विशेष रूप से, मुझे आश्चर्य है कि क्या मुझे ::operator new के बुनियादी सादे रूप को हमेशा शून्य सूचकांक लौटने के लिए अधिभारित करने की अनुमति है, और इसलिए उम्मीद है कि उस ऑपरेटर का उपयोग करने वाले सभी सादे नए-अभिव्यक्ति अब शून्य पॉइंटर्स वापस आ जाएंगे।

भाषा विनिर्देश के अनुसार, यदि मेरा ::operator new गैर-फेंकने के रूप में घोषित किया गया है, तो मैं एक शून्य सूचक लौटाकर स्मृति आवंटन विफलता को इंगित/कर सकता हूं। तो, चलिए बस

void *operator new(size_t s) throw() { 
    return 0; 
} 

int main() { 
    int *i = new int; 
} 

मेरे प्रयोगों में, उपर्युक्त नई अभिव्यक्ति सफलतापूर्वक शून्य सूचक लौटाती है। तो, क्या मैं उपरोक्त कोड में किसी भी नियम को तोड़ रहा हूं या नहीं? यह एक सादे ::operator new के रूप में गैर फेंकने की घोषणा करने के कानूनी है?

और यदि उपरोक्त कोड ठीक है, तो मुझे लगता है कि जब कोई कहता है कि एक सादा नया "कभी शून्य सूचक नहीं देता है", तो वे यह मानते हैं कि ::operator new का मानक-लाइब्रेरी-प्रदत्त संस्करण नहीं रहा है जगह ले ली। क्या यह धारणा सही है?

+0

इस चर्चा के लिए एक और पहलू है - भले ही मानक आपको स्पष्ट रूप से 'nullptr'/'0' वापस लौटने की अनुमति देता है जैसा कि आपने कहा है, मानक पुस्तकालयों को' 0 'को संभालने के लिए आवश्यक हैं? मैं शर्त लगाता हूं कि वे नहीं हैं - और कार्यान्वयन नहीं करते हैं - इसलिए यह * अव्यवहारिक * होगा * एक प्रोग्राम लिखने के लिए ':: ऑपरेटर नई' वापसी 0। उदा। 20.8.9.1/4 को 'std :: आवंटित :: आवंटित' फेंक 'std :: bad_alloc' की आवश्यकता होती है यदि भंडारण प्राप्त नहीं किया जा सकता है - क्या यह (आमतौर पर अनावश्यक रूप से) शून्य के लिए जांच करेगा, या फेंकने के लिए' :: ऑपरेटर नया 'विश्वास करेगा? –

+0

क्या 'नए' के ​​गैर-फेंकने वाले संस्करण को एक अलग हस्ताक्षर की आवश्यकता नहीं है? 'शून्य * ऑपरेटर नया (std :: size_t आकार); 'एक शून्य सूचक वापस नहीं कर सकता है, इसे त्रुटि के मामले में फेंकना पड़ता है भले ही इसे फिर से परिभाषित किया गया हो। – user657267

+0

मानक पुस्तकालय मानक निर्माण के लिए ':: नया टी' और ':: नया (static_cast (get_allocator() (1)) T' प्लेसमेंट के लिए उपयोग करेगा, और वे रूप हमेशा फेंकने आवंटन फ़ंक्शन का आह्वान करेंगे (भले ही वह बदल दिया गया है) –

उत्तर

1

ऑपरेटर आपको जगह ले सकता है यह है गलती की स्थिति में

[new.delete फेंकने के लिए इस प्रकार

[replacement.functions]

(2.1) — operator new(std::size_t) 
(2.2) — operator new(std::size_t, const std::nothrow_t&) 
(2.3) — operator new[](std::size_t) 
(2.4) — operator new[](std::size_t, const std::nothrow_t&) 
(2.5) — operator delete(void*) 
(2.6) — operator delete(void*, const std::nothrow_t&) 

void *operator new(size_t s) throw() अमान्य है कर रहे हैं, .single]

void* operator new(std::size_t size); 

3 आवश्यक व्यवहार: गैर-शून्य पॉइंटर को संग्रहण (3.7.4) को उचित रूप से गठबंधन करने के लिए, या फिर bad_alloc अपवाद फेंक दें। इस आवश्यकता को इस समारोह की एक प्रतिस्थापन संस्करण के लिए बाध्यकारी है।

आप फिर भी सुरक्षित रूप से एक समारोह है कि हमेशा अशक्त देता है, जो कोई भी कॉल के रूप में इन भार के इस व्यवहार के बारे में पता हो सकता है और तदनुसार वापसी मान की जांच करना चाहिए के साथ गैर फेंकने noexcept भार के बदल सकते हैं। जाहिर है वे जब तक nothrow टैग पारित हो जाता है कहा जाता है नहीं किया जाएगा, यानी int* i = new (std::nothrow) int;

void* operator new(std::size_t size, const std::nothrow_t&) noexcept; 

7 आवश्यक व्यवहार: उपयुक्त रूप से गठबंधन करने के लिए एक गैर-शून्य सूचक लौटें भंडारण (3.7.4), या फिर एक वापसी नल पॉइंटर। operator new के इस nothrow संस्करण एक सूचक से प्राप्त करता है, तो के रूप में प्राप्त रिटर्न (संभवतः प्रतिस्थापित) साधारण संस्करण।यह आवश्यकता इस फ़ंक्शन के प्रतिस्थापन संस्करण पर बाध्यकारी है।

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