C++ reference के अनुसार, आप द्वारा एक वस्तु नई The कर सकते हैं:क्यों नई std :: nothrow संस्करण व्यापक रूप से इस्तेमाल नहीं किया गया है
MyClass * p1 = new MyClass;
या द्वारा
MyClass * p2 = new (std::nothrow) MyClass;
दूसरा एक के बजाय एक अशक्त सूचक वापस आ जाएगी अपवाद फेंकने का।
हालांकि, मैं शायद ही इस संस्करण को अपने अनुभव में देखता हूं।
उदाहरण के लिए Google अपने कोड में अपवाद का उपयोग करने की अनुशंसा नहीं करता है, लेकिन वे क्रोमियम में नोट्रो संस्करण का उपयोग नहीं कर रहे हैं जैसा कि मैं देख सकता हूं।
क्या कोई कारण है कि हम एक को धोखाधड़ी के खिलाफ डिफ़ॉल्ट पसंद करते हैं? यहां तक कि एक परियोजना में जो अपवाद का उपयोग नहीं कर रहा है?
- संपादित करें -
सवाल अनुवर्ती कार्रवाई: मैं malloc()
की वापसी मान की जाँच करनी चाहिए?
यह की तरह लग रहा इसके विपरीत, कई लोगों को सलाह malloc की वापसी मान की जाँच करने के लिए, कुछ ने कहा है क्योंकि:
कई आवंटन विफलताओं की स्मृति समाप्त होने से कोई लेना देना नहीं है। Fragmentation एक आवंटन विफल होने का कारण बन सकता है क्योंकि पर्याप्त स्मृति उपलब्ध नहीं है, भले ही बहुत सारी मेमोरी मुक्त हो।
क्या यह सच है? हम इस मामले में अलग-अलग malloc()
और new()
का इलाज क्यों करते हैं?
यदि नया विफल रहता है तो आपको स्मृति से अधिक संभावना होती है और किसी भी तरह से बाहर निकलने की आवश्यकता होती है ... – Kelm
ध्यान दें कि अन्य भाषाओं जैसे जावा - हम एक * अपवाद * और * त्रुटि * के बीच अंतर करते हैं (जो आमतौर पर * घातक)। जावा में, स्मृति से बाहर एक * त्रुटि * है और एक * अपवाद * नहीं है। – amit
राय पूछने के अलावा, आपका अंतिम प्रश्न विरोधाभासी प्रतीत होता है। परिभाषा यदि आप अपवाद-फेंकने वाले संस्करण का उपयोग करते हैं, तो आप अपवादों का उपयोग कर रहे हैं, इस प्रकार "एक ऐसी परियोजना में भी जो अपवादों का उपयोग नहीं कर रहा है" का बिंदु बना रहा है। यदि "अपवादों का उपयोग नहीं करते" तो आपका मतलब है कि आपके पास कोई प्रयास-पकड़-ब्लॉक नहीं है और इसलिए रनटाइम अपवाद को पकड़ लेगा और प्रोग्राम को समाप्त करेगा (आमतौर पर) आप * stll * अपवादों का उपयोग कर रहे हैं; आप बस अपने लेखित कोड में * हैंडलिंग * नहीं कर रहे हैं। – WhozCraig