2013-08-05 4 views
14

C++ reference के अनुसार, आप द्वारा एक वस्तु नई The कर सकते हैं:क्यों नई std :: nothrow संस्करण व्यापक रूप से इस्तेमाल नहीं किया गया है

MyClass * p1 = new MyClass; 

या द्वारा

MyClass * p2 = new (std::nothrow) MyClass; 

दूसरा एक के बजाय एक अशक्त सूचक वापस आ जाएगी अपवाद फेंकने का।

हालांकि, मैं शायद ही इस संस्करण को अपने अनुभव में देखता हूं।

उदाहरण के लिए Google अपने कोड में अपवाद का उपयोग करने की अनुशंसा नहीं करता है, लेकिन वे क्रोमियम में नोट्रो संस्करण का उपयोग नहीं कर रहे हैं जैसा कि मैं देख सकता हूं।

क्या कोई कारण है कि हम एक को धोखाधड़ी के खिलाफ डिफ़ॉल्ट पसंद करते हैं? यहां तक ​​कि एक परियोजना में जो अपवाद का उपयोग नहीं कर रहा है?

- संपादित करें -

सवाल अनुवर्ती कार्रवाई: मैं malloc() की वापसी मान की जाँच करनी चाहिए?

यह की तरह लग रहा इसके विपरीत, कई लोगों को सलाह malloc की वापसी मान की जाँच करने के लिए, कुछ ने कहा है क्योंकि:

कई आवंटन विफलताओं की स्मृति समाप्त होने से कोई लेना देना नहीं है। Fragmentation एक आवंटन विफल होने का कारण बन सकता है क्योंकि पर्याप्त स्मृति उपलब्ध नहीं है, भले ही बहुत सारी मेमोरी मुक्त हो।

क्या यह सच है? हम इस मामले में अलग-अलग malloc() और new() का इलाज क्यों करते हैं?

+0

यदि नया विफल रहता है तो आपको स्मृति से अधिक संभावना होती है और किसी भी तरह से बाहर निकलने की आवश्यकता होती है ... – Kelm

+1

ध्यान दें कि अन्य भाषाओं जैसे जावा - हम एक * अपवाद * और * त्रुटि * के बीच अंतर करते हैं (जो आमतौर पर * घातक)। जावा में, स्मृति से बाहर एक * त्रुटि * है और एक * अपवाद * नहीं है। – amit

+1

राय पूछने के अलावा, आपका अंतिम प्रश्न विरोधाभासी प्रतीत होता है। परिभाषा यदि आप अपवाद-फेंकने वाले संस्करण का उपयोग करते हैं, तो आप अपवादों का उपयोग कर रहे हैं, इस प्रकार "एक ऐसी परियोजना में भी जो अपवादों का उपयोग नहीं कर रहा है" का बिंदु बना रहा है। यदि "अपवादों का उपयोग नहीं करते" तो आपका मतलब है कि आपके पास कोई प्रयास-पकड़-ब्लॉक नहीं है और इसलिए रनटाइम अपवाद को पकड़ लेगा और प्रोग्राम को समाप्त करेगा (आमतौर पर) आप * stll * अपवादों का उपयोग कर रहे हैं; आप बस अपने लेखित कोड में * हैंडलिंग * नहीं कर रहे हैं। – WhozCraig

उत्तर

23

हालांकि, मुझे शायद ही यह अनुभव मेरे अनुभव में दिखाई देता है।

यदि आप स्थानीय रूप से विफलता को संभाल सकते हैं तो आप इसका उपयोग करेंगे (या, समतुल्य रूप से, डिफ़ॉल्ट संस्करण से अपवाद पकड़ लें); शायद किसी अन्य स्मृति को मुक्त करने और फिर पुनः प्रयास करने, या कुछ छोटे आवंटित करने की कोशिश करके, या एक वैकल्पिक एल्गोरिदम का उपयोग करके, जिसे अतिरिक्त मेमोरी की आवश्यकता नहीं है।

क्या कोई कारण है कि हम एक को धोखाधड़ी के खिलाफ डिफ़ॉल्ट पसंद करते हैं?

अपवादों का सामान्य सिद्धांत: यदि आप इसे स्थानीय रूप से संभाल नहीं सकते हैं, तो स्थानीय रूप से जांचने में कोई बात नहीं है। रिटर्न वैल्यू के विपरीत, अपवादों को अनदेखा नहीं किया जा सकता है, इसलिए बिना किसी पॉइंटर पर ध्यान दिए बिना और खेती करने की कोई संभावना नहीं है।

यहां तक ​​कि एक ऐसी परियोजना में जो अपवाद का उपयोग नहीं कर रहा है?

अक्सर, आउट-ऑफ-मेमोरी स्थिति को संभाला नहीं जा सकता है। उस स्थिति में, कार्यक्रम को समाप्त करना शायद सबसे अच्छा प्रतिक्रिया है; और यह एक अनचाहे अपवाद के लिए डिफ़ॉल्ट प्रतिक्रिया है। इसलिए, भले ही आप अपवादों का उपयोग नहीं कर रहे हैं, डिफ़ॉल्ट स्थिति new शायद अधिकांश स्थितियों में सबसे अच्छा विकल्प है।

क्या मुझे malloc() का वापसी मूल्य देखना चाहिए?

हां: यह जांचने का एकमात्र तरीका है कि यह सफल हुआ या नहीं। यदि आप नहीं करते हैं, तो आप एक शून्य सूचक का उपयोग कर समाप्त कर सकते हैं, अपरिभाषित व्यवहार दे सकते हैं: अक्सर एक दुर्घटना, लेकिन शायद डेटा भ्रष्टाचार या अन्य विचित्र व्यवहार और लंबे समय से डिबगिंग सत्र (उम्मीद है) कि क्या गलत हो गया है।

हम इस मामले में अलग-अलग malloc() और new का इलाज क्यों करते हैं?

malloc क्योंकि बलों हमें वापसी मान की जाँच करने, जबकि new हमें कम दखल त्रुटि हैंडलिंग का विकल्प देता है।

4

यदि आप फेंकने वाले संस्करण का उपयोग करते हैं तो आपको यह देखने के लिए कि क्या यह सफल हुआ या विफल हुआ, प्रत्येक new कॉल के परिणाम की जांच करने की आवश्यकता नहीं है। आम तौर पर कई/अधिकांश अनुप्रयोगों में बोलते हुए यदि आपका आवंटन विफल रहता है तो आप अधिक कुछ नहीं कर सकते हैं और केवल बाहर निकल सकते हैं/निरस्त कर सकते हैं, जो अपवाद स्वचालित रूप से आपके लिए करता है यदि आप स्पष्ट रूप से प्रयास/पकड़ नहीं लेते हैं।

यदि आप nothrow संस्करण का उपयोग करते हैं तो आप अपने आवेदन के माध्यम से एक नल पॉइंटर का प्रचार कर सकते हैं और बाद में स्मृति आवंटन से पूरी तरह से असंबंधित एक बिंदु पर दुर्घटनाग्रस्त/बाहर निकल सकते हैं, जिससे डीबगिंग बहुत कठिन हो जाती है।

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

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