2008-10-27 11 views

उत्तर

45

मौजूदा मानक के अनुसार, नई कभी नहीं देता है शून्य, यह एक std :: bad_alloc बजाय फेंकता है। यदि आप नए फेंकना नहीं चाहते हैं (पुराने मानक के अनुसार) लेकिन बदले में वापस लौटें तो आपको इसे "(std :: nothrow)" के साथ पोस्टफिक्स करके कॉल करना चाहिए। अर्थात

Foo* foo = new (std::nothrow) Foo; 
बेशक

, यदि आप एक बहुत पुरानी या संभवतः टूटा toolchain है यह मानक का पालन नहीं हो सकता है।

+0

"शून्य यह कभी रिटर्न" ... तो आप आगे जाना है और अपने आप को खंडन :) एसटीडी का उपयोग कर :: nothrow के पहले भाग में आता है अपने कथन झूठा :) –

+0

यह झूठा नहीं बनाता है, बस थोड़ा असंगत है। नए "सामान्य" कथन कभी वापस नहीं लौटाता है। – Gorpik

+1

हालांकि जवाब को ठीक करने में कोई दिक्कत नहीं होगी! –

0

आमतौर पर कोई भी नए कोड में नए की वापसी का परीक्षण नहीं करता है क्योंकि विजुअल स्टूडियो अब मानक कहता है।

पुराने कोड में अगर फेंकने से बचने के लिए एक हैक किया गया है तो आप अभी भी बेहतर परीक्षण करेंगे।

+0

इस सवाल के बारे में क्या बताया गया कि पर्यावरण एमएस देवस्टूडियो था? –

+0

कुछ भी नहीं। लेकिन अगर विजुअल स्टूडियो को यह फिक्स नहीं मिला है तो पोस्टर इस स्थिति में बहुत कम होने की संभावना है "मैं आमतौर पर सी ++ में नए के लिए परीक्षण कभी नहीं देखता"। तो मैंने इसे समझाया। –

4

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

यह केवल वास्तव में एम्बेडेड प्रोग्रामिंग में है, जहां अपवाद हैंडलिंग को ओवरहेड का बहुत अधिक माना जाता है, और स्मृति बहुत सीमित है, प्रोग्रामर नई विफलताओं की जांच करने के लिए परेशान हैं।

+0

अपवाद को पकड़ना और डिस्क पर डेटा सहेजना, ऐप क्रैश देने से बेहतर तरीका हो सकता है ... –

+0

लेकिन कैसे? आधुनिक सी ++ जगह पर ऑब्जेक्ट सृजन से भरा है। जब एक "नया" विफल रहता है तो इसकी दृढ़ता से उम्मीद है कि नए प्रयासों के आगे भी प्रयास विफल हो जाएंगे। जिसका मतलब डिस्क पर डेटा को जारी रखने का प्रयास भी असफल हो जाएगा। –

+1

"जहां स्मृति से बाहर निकलना लगभग असंभव है" मैं असहमत हूं कि 32 बिट प्रक्रिया पर वर्चुअल मेमोरी से बाहर निकलना आसान है - विंडोज़ में आपको केवल 2 गीगा पता स्थान मिलता है - किसी भी डोमेन में सैंपल डेटा - वीडियो, मेडिकल इत्यादि शामिल होते हैं। आसानी से इस अप या खंड को भर सकते हैं जिससे यह आवंटन विफलता – morechilli

3

के रूप में उद्धृत किया here

", आईएसओ सी ++ मानक के अनुरूप अगर वहाँ आवंटन के लिए पर्याप्त स्मृति नहीं है compilers में, कोड के प्रकार std :: bad_alloc एक अपवाद फेंकता है। बाद के सभी कोड जब तक निरस्त किया गया है त्रुटि को एक कोशिश-पकड़ ब्लॉक में संभाला जाता है या प्रोग्राम असामान्य रूप से बाहर निकलता है। कार्यक्रम को सूचक के मूल्य की जांच करने की आवश्यकता नहीं होती है; अगर कोई अपवाद नहीं फेंक दिया जाता है, तो आवंटन सफल हो जाता है। "

7

यह सब आपके अनुपालन वीसी ++ पर निर्भर करता है जो संस्करण 6 तक गैर-एमएफसी अनुप्रयोग पर नया ऑपरेटर विफल होने पर शून्य देता है।

अब समस्या बड़ी है जब आप कुलपति ++ 6 के साथ उदाहरण एसटीएल के लिए उपयोग हो जाता है, क्योंकि एसटीएल मानकों यह NULL के लिए परीक्षण कभी नहीं होगा, जब वह कुछ स्मृति पाने के लिए जरूरत है, और लगता है कि क्या कम स्मृति परिस्थितियों में क्या होगा के साथ चला जाता है। ...

तो वीसी ++ 6 और एसटीएल का उपयोग करने वाले हर किसी के लिए इस आलेख को फिक्स के लिए जांचें। Don't Let Memory Allocation Failures Crash Your Legacy STL Application

3
  1. newstd::bad_alloc डिफ़ॉल्ट रूप से फेंकता है। यदि आप डिफ़ॉल्ट का उपयोग करते हैं, तो शून्य की जांच अप्रचलित है, लेकिन अपवादों को संभालना आवश्यक है।यह डिफ़ॉल्ट व्यवहार सी ++ अपवाद सुरक्षा प्रतिमान के अनुरूप है - यह आमतौर पर प्रदान करता है कि किसी ऑब्जेक्ट को या तो

  2. यदि आप new (std::nothrow) का उपयोग करके डिफ़ॉल्ट ओवरराइड करते हैं, तो शून्य पर जांच करना आवश्यक है। "नया" दोनों आवंटित करता है और पृष्ठों को करता है, इसलिए स्मृति से बाहर निकलना संभव है, या तो क्योंकि आप पेज डिस्क्रिप्टर से बाहर हो गए हैं, या क्योंकि कोई भौतिक स्मृति उपलब्ध नहीं है

  3. अपने ओएस के मेमोरी प्रबंधन का शोध करें। सी/सी ++ संदर्भ मशीन यह नहीं जानती कि आपका ओएस स्मृति कैसे प्रबंधित करता है, इसलिए अकेले भाषा पर भरोसा सुरक्षित नहीं है। स्मृति आवंटन बुरा चला की उदाहरण के लिए, malloc() + लिनक्स सी पर पढ़ा ओवरकमिट

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