new
ऑपरेटर (या के लिए फलियों, malloc/calloc) जब स्मृति के बड़े हिस्से का आवंटन में नाकाम रहने के एक सरल और प्रभावी रूप समर्थन करते हैं।क्या मानक लाइब्रेरी (एसटीएल) कंटेनर नोट्रो आवंटन के एक रूप का समर्थन करते हैं?
कहते हैं कि हम इस राशि:
const size_t sz = GetPotentiallyLargeBufferSize(); // 1M - 1000M
T* p = new (nothrow) T[sz];
if(!p) {
return sorry_not_enough_mem_would_you_like_to_try_again;
}
...
वहाँ std :: कंटेनरों के लिए इस तरह के किसी भी निर्माण है, या मैं हमेशा std::vector
और दोस्तों के साथ एक (उम्मीद !!) अपवाद को संभालने के लिए होगा?
वहाँ शायद एक तरीका है कि स्मृति preallocates एक कस्टम संभाजक बारे में और उसके बाद से आप में डाल दिया तो जब तक कि के रूप में वेक्टर अधिक स्मृति के लिए पूछना नहीं है, वेक्टर को यह कस्टम संभाजक पारित करने के लिए होगा आवंटक पहले से, यह असफल नहीं होगा?
बाद का विचार: क्या वास्तव में जरूरत होगी सामान्य आरक्षित समारोह के अलावा एक सदस्य समारोह bool std::vector::reserve(std::nothrow) {...}
थे। लेकिन चूंकि इससे केवल तभी अर्थ होगा जब आवंटन को आवंटित करने की अनुमति देने के लिए भी विस्तारित किया गया था, यह अभी नहीं होगा। लगता है (nothrow) नया कुछ के लिए अच्छा है सब के बाद :-)
संपादित करें: क्यों मैं भी इस पूछ रहा हूँ के रूप में:
मैं इस सवाल के बारे में सोचा है, जबकि डिबगिंग (1 मौका/डिबगर के 2 मौका अपवाद हैंडलिंग): किसी भी bad_alloc पकड़ने क्योंकि मैं कम स्मृति की स्थिति के लिए परीक्षण कर रहा हूँ मैं 1-मौका करने के लिए अपने डिबगर चुके हैं, तो यह कष्टप्रद हो सकता है अगर यह भी उन bad_alloc अपवाद कि पहले से ही अच्छी तरह से कर रहे हैं पकड़ा कोड में अपेक्षित और संभाला गया। यह नहीं था/एक बहुत बड़ी समस्या नहीं है, लेकिन यह सिर्फ मेरे लिए हुआ धर्मोपदेश चला जाता है कि कि अपवाद असाधारण परिस्थितियों के लिए कर रहे हैं, और कुछ मैं पहले से ही कोड में हर अजीब कॉल होने की अपेक्षा असाधारण नहीं है।
तो new (nothrow)
यह वैध उपयोग करता है है, एक वेक्टर nothrow-आरक्षित भी होगा।
'कोशिश करें ... पकड़' निर्माण लिखना इतना बड़ा सौदा नहीं है। यदि आपके पास बहुत सारे हैं, तो आप अंदरूनी हैंडलिंग के साथ एक एकल रैपर फ़ंक्शन 'टेम्पलेट टी * माईएलोक (size_t)' लिख सकते हैं। –
TonyK
यह कभी-कभी इतना बड़ा सौदा होता है। –
जब भी आप एक गीगाबाइट आवंटित कर रहे हैं और ओओएम पहुंच रहे हैं? मुझे शक है। –