चलिए इस सी ++ कोड को किसी न किसी उदाहरण के रूप में देखते हैं।सी ++ आवंटित सरणी गैर-संयोग से
int *A = new int [5];
int *B = new int [5];
int *C = new int [5];
delete []A;
delete []C;
int *D = new int [10];
जाहिर है किसी भी मशीन बफर अतिप्रवाह या स्मृति रिसाव के साथ किसी भी समस्याओं के बिना इस मामले को संभाल सकता है। हालांकि आइए कल्पना करें कि लंबाई एक लाख या इससे भी बड़ी संख्या में गुणा हो जाती है। जहां तक मुझे पता है कि सभी सरणी तत्वों के पते (कम से कम आभासी पते) लगातार हैं। इसलिए जब भी मैं एक सरणी बनाता हूं, तो मैं यह सुनिश्चित कर सकता हूं कि वे वर्चुअल मेमोरी में संगत भाग हैं और मैं पॉइंटर अंकगणित को एन-वें तत्व तक पहुंचने के लिए कर सकता हूं यदि मेरे पास पहले पॉइंटर है। मेरा प्रश्न निम्नलिखित छवि में दिखाया गया है (सरणी के अंत के लिए सरणी के अंत का प्रतिनिधित्व करने वाले रजिस्टरों को अनदेखा किया जाता है)।
ढेर में ए, बी, सी आवंटित करने के बाद हम ए और सी मुक्त करते हैं और लंबाई 5 के दो मुक्त मेमोरी भाग प्राप्त करते हैं (हरे रंग के बिंदुओं के साथ चिह्नित)। क्या होता है जब मैं लंबाई 10 की आवंटित करना चाहता हूं? मुझे लगता है कि 3 संभावित मामले हैं।
- मुझे 10 गुना स्मृति खंड न होने के लिए bad_alloc अपवाद मिलेगा।
- प्रोग्राम स्वचालित रूप से ढेर की शुरुआत में सरणी बी को पुन: आवंटित करेगा और शेष अप्रयुक्त स्मृति में एक साथ जुड़ जाएगा।
सरणी डी को 2 भागों में विभाजित किया जाएगा और सरणी के एन-वें तत्व के लिए निरंतर पहुंच समय नहीं होने के कारण संग्रहीत नहीं किया जाता है (यदि 2 से अधिक विभाजन होते हैं तो यह एक सरणी के बजाय एक लिंक्ड सूची जैसा दिखता है)।
इनमें से कौन सा सबसे संभावित उत्तर है या क्या कोई और संभावित मामला मैंने ध्यान में नहीं लिया है?
यह बहुत ओएस निर्भर है। –
@JamesAdkison हां, मान लें कि हमारे पास हीप मेमोरी के केवल 15 रजिस्ट्रार हैं। अन्यथा सवाल व्यर्थ होगा। –
यह इस तथ्य को भी अनदेखा करता है कि प्रोग्राम * वर्चुअल * मेमोरी * के विपरीत * भौतिक हार्डवेयर मेमोरी * का उपयोग करते हैं। यह एक सैद्धांतिक सवाल है। सैद्धांतिक उत्तर 'नई' या 'malloc' को उपलब्ध स्मृति से अधिक के लिए बाद के अनुरोध पर 'NULL' वापस करने की अपेक्षा करना होगा। –