मैं एक छात्र हूं और मेरे पास सी ++ पर छोटा ज्ञान है, जिसे मैं विस्तार करने का प्रयास करता हूं। यह एक दार्शनिक सवाल है .. मैं कुछ लागू करने की कोशिश नहीं कर रहा हूं।नोट्रो या अपवाद?
के बाद से
#include <new>
//...
T * t = new (std::nothrow) T();
if(t)
{
//...
}
//...
अपवाद को छिपाने करेंगे, और अपवाद के साथ काम कर के बाद से भारी है, एक सरल if(t)
की तुलना में है यही कारण है कि सामान्य new T()
नहीं माना कम अच्छा अभ्यास नहीं है, पर विचार हम try-catch()
का उपयोग करना होगा यह जांचने के लिए कि क्या एक साधारण आवंटन सफल हुआ (और यदि हम नहीं करते हैं, तो बस कार्यक्रम को मरें) ??
nothrow new
का उपयोग करने की तुलना में सामान्य new
आवंटन के लाभ (यदि कोई हैं) क्या हैं? उस मामले में अपवाद का ओवरहेड महत्वहीन है?
यह भी मान लें कि आवंटन विफल रहता है (उदाहरण के लिए। सिस्टम में कोई स्मृति मौजूद नहीं है)। क्या ऐसी स्थिति में प्रोग्राम कुछ भी कर सकता है, या बस ग़लत ढंग से विफल हो सकता है। ढेर पर मुफ्त मेमोरी खोजने का कोई तरीका नहीं है, जब सब आरक्षित है, है ना?
बैठाना आवंटन में विफल रहता है, और एक std::bad_alloc
throw
n है, हम कैसे मान सकते हैं कि के बाद से वहाँ एक वस्तु आवंटित करने के लिए पर्याप्त स्मृति नहीं है (उदाहरण के लिए। एक new int
), वहाँ एक अपवाद स्टोर करने के लिए पर्याप्त स्मृति होगा ??
आपके समय के लिए धन्यवाद। मुझे उम्मीद है कि सवाल नियमों के अनुरूप है।
यदि उपरोक्त आपके कोड में नया विफल रहता है। यदि आप कथन में क्या करने की योजना बना रहे हैं? इस बिंदु पर त्रुटि को ठीक करने का कोई तरीका नहीं है। –
@ मार्टिन, वास्तव में कुछ भी नहीं। मैं इस मामले के बारे में सिर्फ उत्सुक था और यदि 'नोट्रो' का उपयोग करने पर कोई फायदा होता है। असल में जवाब कई चीजों को स्पष्ट कर दिया। – Muggen
आपने स्मृति आवंटन में एक दुर्भाग्यपूर्ण उदाहरण चुना है। आधुनिक डेस्कटॉप ओएस पर चल रहे अनुप्रयोग आम तौर पर अपवाद नहीं फेंकते हैं या स्मृति से बाहर होने पर त्रुटि संदेश लौटाते हैं।इसके बजाए, पूरी प्रणाली बस जम जाती है, जबकि ओएस धीमी भंडारण का उपयोग करके अनुरोधित स्मृति को "अनुकरण" की खोने वाली लड़ाई से लड़ता है। लेकिन अपवाद बनाम वापसी कोड का सवाल अच्छा है अगर फ़ाइल I/O, नेटवर्क एक्सेस, स्ट्रिंग पार्सिंग, या किसी अन्य कार्य पर लागू होता है। –