डायनेमिक मेमोरी आवंटन C ++ के साथ कैसे काम करें?



यह आलेख डायनेमिक मेमोरी आवंटन C ++ में एक महत्वपूर्ण विशेषता की खोज करता है जो आपको वास्तविक समय संसाधनों के लिए अपनी मेमोरी की जरूरतों पर विचार करने देता है।

डायनेमिक मेमोरी आवंटन C ++ में एक बहुत महत्वपूर्ण विशेषता है जो आपको वास्तविक समय संसाधनों की आवश्यकता से निपटने के लिए अपनी आवश्यकताओं पर विचार करने देता है। इस लेख में हम खोज करेंगे विस्तार से जानकारी इस आलेख में निम्नलिखित बिंदुओं को शामिल किया जाएगा,

तो चलिए इस आर्टिकल को C ++ में डायनामिक मेमोरी एलोकेशन पर शुरू करते हैं





गतिशील स्मृति आवंटन की आवश्यकता है?

मान लें, हम एक वाक्य को वर्णों के एक सरणी के रूप में इनपुट करना चाहते हैं, लेकिन हम सरणी में आवश्यक वर्णों की सटीक संख्या के बारे में निश्चित नहीं हैं।

अब, वर्ण सरणी की घोषणा करते समय, यदि हम इसका आकार वांछित स्ट्रिंग के आकार से छोटा निर्दिष्ट करते हैं, तो हमें एक त्रुटि मिलेगी क्योंकि इनपुट स्ट्रिंग के आकार की तुलना में सरणी को आवंटित मेमोरी में स्थान कम है। यदि हम इसका आकार इनपुट स्ट्रिंग के आकार से बड़ा निर्दिष्ट करते हैं, तो सरणी को मेमोरी में एक स्थान आवंटित किया जाएगा जो वांछित स्ट्रिंग के आकार से बहुत बड़ा है, इस प्रकार अनावश्यक रूप से आवश्यकता होने पर भी अधिक मेमोरी का उपभोग करना।



उपरोक्त मामले में, हमें संकलन-समय (जब कंप्यूटर कोड को संकलित करता है और स्ट्रिंग उपयोगकर्ता द्वारा इनपुट करता है) तक सरणी के सटीक आकार के बारे में विचार नहीं है। ऐसे मामलों में, हम उपयोग करते हैं नया ऑपरेटर।

C ++ दो यूनिरी ऑपरेटर्स को परिभाषित करता है नया तथा हटा दें जो रनटाइम के दौरान मेमोरी को आवंटित करने और डील करने का कार्य करता है। चूंकि ये ऑपरेटर (नई और डिलीट) फ्री स्टोर मेमोरी (हीप मेमोरी) पर काम करते हैं, इसलिए उन्हें फ्री स्टोर ऑपरेटर भी कहा जाता है। पॉइंटर्स C ++ में डायनामिक मेमोरी एलोकेशन सिस्टम के लिए आवश्यक सहायता प्रदान करते हैं।

डायनामिक आवंटन की मदद से, एक प्रोग्राम रनटाइम के दौरान मेमोरी प्राप्त कर सकता है।



वैश्विक और स्थानीय चर संकलन-समय के दौरान मेमोरी में आवंटित किए जाते हैं। हालाँकि, हम रनटाइम के दौरान कोई वैश्विक या स्थानीय चर नहीं जोड़ सकते हैं। यदि कार्यक्रम को स्मृति की चर राशि का उपयोग करने की आवश्यकता होती है, तो हमें रनटाइम के दौरान, आवश्यकतानुसार और जब भी स्मृति को आवंटित करना होगा। और निश्चित रूप से, यहां गतिशील आवंटन दिनचर्या उद्देश्य पूरा कर सकती है।

स्थैतिक स्मृति आवंटन और गतिशील स्मृति आवंटन के बीच अंतर:

यह किसी C ++ प्रोग्राम के लिए उपयोग की जाने वाली एक बेसिक मेमोरी आर्किटेक्चर है:

मेमोरी - डायनेमिक मेमोरी आवंटन - एडुर्का

हमें इस तरह की एक छवि की आवश्यकता होगी

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

वैरिएबल जो स्टैक पर आबंटित हो जाते हैं जबकि स्टैटिक मेमोरी एलोकेशन सीधे मेमोरी में स्टोर हो जाता है और इस मेमोरी तक पहुंच बहुत तेज है, साथ ही इसका एलोकेशन प्रोग्राम कंपाइल होने पर निपटा जाता है। जब कोई फ़ंक्शन या कोई विधि किसी अन्य फ़ंक्शन को कॉल करती है, जो बदले में किसी अन्य फ़ंक्शन को कॉल कर सकती है और इसी तरह, इन सभी कार्यों का निष्पादन तब तक निलंबित रहता है जब तक कि अंतिम फ़ंक्शन इसके मूल्य को वापस नहीं करता है। स्टैक को हमेशा एक LIFO (पिछली बार पहले आउट) क्रम में संग्रहीत किया जाता है, सबसे हाल ही में आरक्षित ब्लॉक को मुक्त करने के लिए हमेशा अगला ब्लॉक होता है। यह स्टैक का ट्रैक रखने में मदद करता है, स्टैक से एक ब्लॉक को मुक्त करना एक पॉइंटर को समायोजित करने से ज्यादा कुछ नहीं है।

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

C ++ में डायनामिक मेमोरी आवंटन पर इस लेख के साथ आगे बढ़ना

मेमोरी का उपयोग कर आवंटन नया कीवर्ड

C ++ में नया ऑपरेटर का उपयोग रनटाइम पर मेमोरी आवंटित करने के लिए किया जाता है और मेमोरी को बाइट्स में आवंटित किया जाता है। द नया ऑपरेटर हीप पर डायनेमिक मेमोरी आवंटन के लिए अनुरोध को दर्शाता है। यदि पर्याप्त स्मृति उपलब्ध हो तो नया ऑपरेटर मेमोरी को इनिशियलाइज़ करता है और पॉइंटर वैरिएबल को नए आवंटित और इनिशियलाइज्ड मेमोरी का पता देता है।

वाक्य - विन्यास:

डेटाटाइप * पॉइंटर_नाम = नया डेटाटाइप

उदाहरण:

int * ptr = new int // हम निम्नलिखित दो तरीकों से डायनामिक आवंटन करते हुए एक चर घोषित कर सकते हैं। int * ptr = new int (10) int * ptr = new int {15} // नए ऑपरेटर का उपयोग प्रकार के डेटा-प्रकार की मेमोरी के ब्लॉक (एरे) को आवंटित करने के लिए भी किया जाता है। int * ptr = new int [20] // उपरोक्त कथन डायनामिक रूप से 20 पूर्णांकों के लिए निरंतर रूप से मेमोरी आवंटित करता है और अनुक्रम के पहले तत्व को the ptr 'पॉइंटर पर लौटाता है।

ध्यान दें : यदि ढेर को आवंटित करने के लिए पर्याप्त मेमोरी नहीं है, तो नया अनुरोध अपवाद std :: bad_alloc को फेंककर विफलता को इंगित करता है, जब तक कि नए ऑपरेटर के साथ 'nothrow' का उपयोग नहीं किया जाता है, उस स्थिति में यह एक NULL पॉइंटर लौटाता है। इसलिए, प्रोग्राम में उपयोग करने से पहले नए द्वारा उत्पादित सूचक चर की जांच करना एक अच्छा अभ्यास है।

विंडोज़ 7 पर php स्थापित करें

C ++ में डायनामिक मेमोरी आवंटन पर इस लेख के साथ आगे बढ़ना

मेमोरी का उपयोग करने का बहिष्कार हटा दें कीवर्ड:

एक बार ढेर स्मृति का उपयोग कर एक चर या वर्ग वस्तु के लिए आवंटित किया गया है नया कीवर्ड, हम उस मेमोरी स्पेस का उपयोग कर सकते हैं हटा दें कीवर्ड।

वाक्य - विन्यास:

हटाएँ pointer_variable // यहाँ, pointer_variable सूचक है जो नए द्वारा बनाई गई डेटा ऑब्जेक्ट को इंगित करता है। हटाएं [] pointer_variable // सूचक-चर द्वारा इंगित की गई गतिशील रूप से आवंटित सरणी मेमोरी को मुक्त करने के लिए, हम निम्न प्रकार का उपयोग करते हैं:

उदाहरण:

ptr हटाना [] ptr हटाना

ध्यान दें : ऑब्जेक्ट की सीमा या ऑब्जेक्ट का जीवनकाल वह समय है जिसके लिए ऑब्जेक्ट प्रोग्राम के निष्पादन के दौरान मेमोरी में रहता है। हीप मेमोरी आवंटन एक स्टैक की तुलना में धीमा है, चूंकि, ढेर में, कोई विशेष क्रम नहीं है जिसमें आप मेमोरी आवंटित कर सकते हैं जबकि स्टैक में यह LIFO का अनुसरण करता है।

C ++ में डायनामिक मेमोरी आवंटन पर इस लेख के साथ आगे बढ़ना

गतिशील रूप से आवंटन आवंटित करना

डायनामिक मेमोरी एलोकेशन की अवधारणा का प्रमुख उपयोग मेमोरी को एक ऐरे में आवंटित करने के लिए है जब हमें इसके आकार को निर्दिष्ट करके इसे घोषित करना होगा लेकिन इसके बारे में निश्चित नहीं हैं।

आइए देखें, इसके उपयोग को समझने के लिए एक उदाहरण।

# नाम का उपयोग करके नाम स्थान std int main () {int len, sum = 0 cout<< 'Enter the no. of students in the class' <>len int * मार्क्स = नया int [len] // डायनेमिक मेमोरी एलोकेशन कॉउट<< 'Enter the marks of each student' << endl for( int i = 0 i>* (अंक + i)} के लिए (int i = 0 i)

स्पष्टीकरण:
इस उदाहरण में पहले हम एक कक्षा में छात्रों की संख्या के लिए उपयोगकर्ता से पूछते हैं और हम इसका मान लेन चर में संग्रहीत करते हैं। तब हम पूर्णांक की एक सरणी घोषित करते हैं और इसे स्मृति में स्थान देते हैं गतिशील रूप से इस कथन का उपयोग करते हुए लेन चर में संग्रहीत मान के बराबर है int * मार्क्स = नया int [लंबाई] इस प्रकार इसे 'लंबाई * (1 के आकार) के बराबर स्थान आवंटित किया जाता है पूर्णांक) '। बाकी कोड स्व-व्याख्यात्मक है।

C ++ में डायनामिक मेमोरी आवंटन पर इस लेख के साथ आगे बढ़ना

वस्तुओं के लिए गतिशील मेमोरी आवंटन

हम गतिशील रूप से वस्तुओं का आवंटन भी कर सकते हैं।

जैसा कि हम जानते हैं कि कंस्ट्रक्टर एक ऑब्जेक्ट को इनिशियलाइज़ करने के लिए इस्तेमाल किया जाने वाला एक स्पेशल क्लास मेंबर फंक्शन होता है और डिस्ट्रॉक्टर भी एक क्लास मेंबर फंक्शन होता है जिसे जब भी ऑब्जेक्ट स्कोप से बाहर जाता है तो कॉल किया जाता है।

सॉर्ट c ++ एरे

विनाशकर्ता का उपयोग ऑब्जेक्ट को सौंपी गई मेमोरी को जारी करने के लिए किया जा सकता है। इसे निम्नलिखित स्थितियों में कहा जाता है।

  • जब कोई स्थानीय वस्तु दायरे से बाहर जाती है
  • एक वैश्विक वस्तु के लिए, जब एक ऑपरेटर को कक्षा के ऑब्जेक्ट के लिए एक पॉइंटर पर लागू किया जाता है

हम गतिशील रूप से ऑब्जेक्ट को मेमोरी आवंटित करते समय फिर से पॉइंटर्स का उपयोग कर सकते हैं।

आइए वस्तुओं की एक सरणी का एक उदाहरण देखें।

# नामस्थान std वर्ग रैंडम {सार्वजनिक: रैंडम () {cout का उपयोग करके हटा दें<< 'Constructor' << endl } ~Random() { cout << 'Destructor' << endl } } int main() { Random* a = new Random[3] delete [] a // Delete array return 0 } 

आउटपुट:

स्पष्टीकरण:

कंस्ट्रक्टर को तीन बार बुलाया जाएगा क्योंकि हम कक्षा की तीन वस्तुओं को रैंडम करने के लिए मेमोरी आवंटित कर रहे हैं। इन वस्तुओं में से प्रत्येक के दौरान तीन बार विध्वंसक भी कहा जाएगा। ‘रैंडम * a = नया रैंडम [3]’ यह कथन हमारी वस्तु की गतिशील मेमोरी आवंटन के लिए जिम्मेदार है।

इस प्रकार हम 'डायनामिक मेमोरी एलोकेशन सी ++' पर इस लेख के अंत में आए हैं। आप और अधिक जानने के लिए चाहते हैं, तो बाहर की जाँच करें Edureka, एक विश्वसनीय ऑनलाइन शिक्षण कंपनी है। एडुर्का के जावा जे 2 ईई और एसओए प्रशिक्षण और प्रमाणन पाठ्यक्रम आपको हाइबरनेट और स्प्रिंग जैसे विभिन्न जावा फ्रेमवर्क के साथ कोर और उन्नत जावा अवधारणाओं दोनों के लिए प्रशिक्षित करने के लिए डिज़ाइन किया गया है।

क्या आप हमसे कोई प्रश्न पूछना चाहते हैं? कृपया इस ब्लॉग के टिप्पणी अनुभाग में इसका उल्लेख करें और हम जल्द से जल्द आपके पास वापस आ जाएंगे।