Dynamic Memory Allocation in C++ Notes | new & delete Operators, Heap Memory, Dynamic Objects & Examples | Basic Computer Engineering | RGPV BTech First Year
Dynamic Memory Allocation in C++ Notes | new & delete Operators, Heap Memory, Dynamic Objects & Examples | Basic Computer Engineering | RGPV BTech First Year
Dynamic Memory Allocation in C++
Dynamic Memory Allocation (DMA) C++ का एक महत्वपूर्ण Feature है जिसकी सहायता से Program के Execution Time (Run Time) पर Memory Allocate तथा Deallocate की जाती है। Static Memory Allocation में Memory Compile Time पर Allocate होती है, जबकि Dynamic Memory Allocation में Memory की आवश्यकता के अनुसार Run Time पर Allocate की जाती है।
C++ में Dynamic Memory Allocation के लिए मुख्य रूप से new तथा delete Operators का उपयोग किया जाता है। new Operator Heap Memory में Memory Allocate करता है, जबकि delete Operator Allocate की गई Memory को Release करता है।
RGPV B.Tech First Year के Basic Computer Engineering Subject में Dynamic Memory Allocation एक अत्यंत महत्वपूर्ण Topic है। University Examination, Practical तथा Viva में new Operator, delete Operator, Heap Memory, Memory Leak तथा Dynamic Objects से संबंधित प्रश्न नियमित रूप से पूछे जाते हैं।
↓
new Operator
↓
Heap Memory
↓
delete Operator
↓
Memory Released
Introduction to Dynamic Memory Allocation
कई Programs में पहले से यह निश्चित नहीं होता कि कितनी Memory की आवश्यकता होगी। यदि Compile Time पर Memory Allocate की जाए, तो या तो Memory कम पड़ सकती है अथवा अनावश्यक Memory Reserve हो सकती है।
इस समस्या के समाधान के लिए C++ में Dynamic Memory Allocation का उपयोग किया जाता है। इसमें Program आवश्यकता के अनुसार Run Time पर Memory Allocate करता है तथा कार्य पूर्ण होने के बाद Memory को Release भी कर सकता है।
What is Dynamic Memory Allocation?
Dynamic Memory Allocation (DMA) वह प्रक्रिया है जिसमें Program के Execution के दौरान आवश्यकता अनुसार Memory Allocate तथा Deallocate की जाती है। यह Memory सामान्यतः Heap Memory से Allocate होती है।
ऊपर दिए गए उदाहरण में new Operator Heap Memory में एक Integer के लिए Memory Allocate करता है तथा उसका Address ptr Pointer में Store करता है।
Need of Dynamic Memory Allocation
जब Program में Memory Requirement पहले से निश्चित न हो, तब Dynamic Memory Allocation सबसे उपयुक्त समाधान होता है। इससे Program अधिक Flexible तथा Efficient बनता है।
- Run Time पर Memory Allocate करने के लिए।
- Memory की Efficient Utilization के लिए।
- Large Data Structures विकसित करने के लिए।
- Linked List, Queue तथा Tree जैसी Dynamic Structures बनाने के लिए।
- अनावश्यक Memory Wastage रोकने के लिए।
- Program की Flexibility बढ़ाने के लिए।
- Professional Software Development के लिए।
Advantages of Dynamic Memory Allocation
| Advantage | Description |
|---|---|
| Efficient Memory Usage | केवल आवश्यकता अनुसार Memory Allocate होती है। |
| Run Time Allocation | Execution के दौरान Memory Allocate की जा सकती है। |
| Flexible Programs | Program बदलती आवश्यकताओं के अनुसार कार्य कर सकता है। |
| Large Data Handling | बड़े Data Structures को आसानी से Manage किया जा सकता है। |
| Memory Reuse | delete Operator द्वारा Memory पुनः उपलब्ध कराई जा सकती है। |
Characteristics of Dynamic Memory Allocation
Dynamic Memory Allocation (DMA) की कई महत्वपूर्ण विशेषताएँ (Characteristics) हैं जो इसे Static Memory Allocation से अलग बनाती हैं। इसमें Memory Program के Run Time पर Allocate होती है तथा आवश्यकता समाप्त होने पर Release की जा सकती है।
- Memory Run Time पर Allocate होती है।
- Memory Heap Area से Allocate की जाती है।
- new Operator द्वारा Memory Allocate की जाती है।
- delete Operator द्वारा Memory Release की जाती है।
- Program की आवश्यकता अनुसार Memory का आकार (Size) निर्धारित किया जा सकता है।
- Dynamic Data Structures बनाने में उपयोगी होती है।
- Memory का Efficient Utilization संभव होता है।
Stack Memory vs Heap Memory
C++ में Memory मुख्य रूप से Stack Memory तथा Heap Memory में विभाजित होती है। Static तथा Local Variables सामान्यतः Stack में Store होते हैं, जबकि Dynamic Memory Allocation Heap में होती है।
| Stack Memory | Heap Memory |
|---|---|
| Compiler द्वारा Automatically Manage होती है। | Programmer द्वारा Manage की जाती है। |
| Compile Time पर Variables Allocate होते हैं। | Run Time पर Memory Allocate होती है। |
| Memory Automatically Release हो जाती है। | delete Operator द्वारा Release करनी पड़ती है। |
| छोटे Data के लिए उपयुक्त। | Large तथा Dynamic Data के लिए उपयुक्त। |
| Execution अपेक्षाकृत तेज़ होती है। | थोड़ी धीमी लेकिन अधिक Flexible होती है। |
Heap Memory
Heap Memory Memory का वह भाग है जहाँ Dynamic Memory Allocation की जाती है। Heap Memory का उपयोग तब किया जाता है जब Program को Run Time पर अतिरिक्त Memory की आवश्यकता होती है।
Heap में Allocate की गई Memory तब तक उपलब्ध रहती है जब तक उसे delete Operator द्वारा Release नहीं किया जाता।
new Operator
new Operator का उपयोग Heap Memory में Memory Allocate करने के लिए किया जाता है। यह Allocate की गई Memory का Address Return करता है जिसे सामान्यतः Pointer Variable में Store किया जाता है।
ऊपर दिए गए उदाहरण में Heap Memory में एक Integer के लिए Memory Allocate की गई है तथा उसका Address ptr में Store किया गया है।
delete Operator
delete Operator का उपयोग Dynamic रूप से Allocate की गई Memory को Release करने के लिए किया जाता है। यदि Memory को समय पर Release नहीं किया जाए, तो Program में Memory Leak हो सकता है।
ऊपर दिए गए Statement द्वारा ptr द्वारा Point की गई Heap Memory Release कर दी जाती है।
Syntax of new and delete
// Deallocation delete pointer;
यदि Dynamic Array Allocate किया गया हो, तो उसे Release करने के लिए delete[] Operator का उपयोग किया जाता है।
Dynamic Memory Allocation for Variables
C++ में किसी एक Variable के लिए Dynamic Memory Allocate करने के लिए new Operator का उपयोग किया जाता है। Allocate की गई Memory का Address Pointer Variable में Store किया जाता है। Program का कार्य समाप्त होने पर उस Memory को delete Operator द्वारा Release करना आवश्यक होता है।
Output
ऊपर दिए गए Program में new Operator Heap Memory में Integer के लिए Memory Allocate करता है तथा delete Operator उस Memory को Release करता है।
Dynamic Memory Allocation for Arrays
यदि Program में Run Time पर Array का Size निर्धारित करना हो, तो Dynamic Memory Allocation का उपयोग किया जाता है। Array के लिए Memory Allocate करने हेतु new[] तथा Release करने हेतु delete[] का उपयोग किया जाता है।
ऊपर दिए गए उदाहरण में पाँच Integer Elements के लिए Heap Memory Allocate की गई है।
Dynamic Memory Allocation for Objects
C++ में Objects को भी Dynamic रूप से Create किया जा सकता है। इससे Object का निर्माण Run Time पर होता है तथा Object Heap Memory में Store होता है।
ऊपर दिए गए Program में Student Class का Object Heap Memory में बनाया गया है तथा Pointer के माध्यम से Access किया गया है।
Dynamic Memory Allocation for 2D Arrays
यदि Program में Two-Dimensional Array का Size Run Time पर निर्धारित करना हो, तो प्रत्येक Row के लिए अलग-अलग Memory Allocate की जाती है। यह Technique बड़े Matrix तथा Scientific Applications में उपयोगी होती है।
ऊपर दिए गए उदाहरण में 3 × 4 का Dynamic Two-Dimensional Array Create किया गया है।
Memory Leak
यदि new Operator द्वारा Allocate की गई Memory को delete द्वारा Release नहीं किया जाता, तो वह Memory Program द्वारा पुनः उपयोग नहीं की जा सकती। इस स्थिति को Memory Leak कहा जाता है।
↓
Memory Allocated
↓
delete Not Called
↓
Memory Leak
Memory Leak के कारण Program धीरे-धीरे अधिक Memory उपयोग करने लगता है जिससे Performance कम हो सकती है तथा लंबे समय तक चलने वाले Applications में System Resources समाप्त हो सकते हैं।
Dangling Pointer
जब किसी Pointer द्वारा Point की जा रही Memory को delete कर दिया जाता है, लेकिन Pointer अभी भी उसी पुराने Address को Store करता रहता है, तब उसे Dangling Pointer कहा जाता है।
ऊपर दिए गए उदाहरण में Memory Release करने के बाद Pointer को NULL Assign किया गया है, जिससे Dangling Pointer की समस्या से बचा जा सकता है।
Advantages of Dynamic Memory Allocation
Dynamic Memory Allocation (DMA) आधुनिक Software Development का एक महत्वपूर्ण भाग है। यह Program को आवश्यकता के अनुसार Memory Allocate करने की सुविधा प्रदान करता है, जिससे Memory का सर्वोत्तम उपयोग (Optimal Utilization) संभव हो पाता है।
- Run Time पर आवश्यकता अनुसार Memory Allocate की जा सकती है।
- Memory Wastage कम होती है।
- Large Data Structures आसानी से बनाए जा सकते हैं।
- Linked List, Stack, Queue, Tree तथा Graph जैसी Dynamic Structures विकसित की जा सकती हैं।
- Memory को आवश्यकता समाप्त होने पर Release किया जा सकता है।
- Program अधिक Flexible एवं Scalable बनता है।
- Professional Applications में Efficient Resource Management संभव होता है।
Limitations of Dynamic Memory Allocation
यद्यपि Dynamic Memory Allocation अत्यंत उपयोगी है, फिर भी इसका गलत उपयोग Program में कई समस्याएँ उत्पन्न कर सकता है।
- Memory को समय पर Release न करने पर Memory Leak हो सकता है।
- Dangling Pointer की समस्या उत्पन्न हो सकती है।
- Memory Allocation एवं Deallocation में अतिरिक्त समय लगता है।
- Heap Memory Fragmentation हो सकती है।
- Improper Pointer Handling से Program Crash हो सकता है।
- Program की Complexity बढ़ सकती है।
- Memory Management पूरी तरह Programmer की जिम्मेदारी होती है।
Best Practices for Dynamic Memory Allocation
- Memory Allocate करने के बाद हमेशा उसकी आवश्यकता समाप्त होने पर delete अथवा delete[] का उपयोग करें।
- Memory Release करने के बाद Pointer को NULL अथवा nullptr Assign करें।
- Unnecessary Dynamic Allocation से बचें।
- Array Allocate करने पर delete[] का ही उपयोग करें।
- Single Variable के लिए केवल delete का उपयोग करें।
- Pointer को Initialize किए बिना उपयोग न करें।
- Memory Leak Detect करने के लिए उचित Debugging Tools का उपयोग करें।
Applications of Dynamic Memory Allocation
| Application | Purpose |
|---|---|
| Linked List | Dynamic Nodes Create करने के लिए। |
| Stack & Queue | Dynamic Size वाली Data Structures विकसित करने के लिए। |
| Binary Tree | Run Time पर Nodes Allocate करने के लिए। |
| Graph | Dynamic Vertices एवं Edges Store करने के लिए। |
| Database Software | Large Records को Efficient तरीके से Store करने के लिए। |
| Operating System | Dynamic Process एवं Resource Management के लिए। |
| Game Development | Run Time पर Characters, Objects एवं Resources Allocate करने के लिए। |
Real Life Example
मान लीजिए किसी Online Examination System में प्रत्येक परीक्षा में विद्यार्थियों (Students) की संख्या अलग-अलग होती है। यदि पहले से Fixed Size Array बनाया जाए, तो Memory Waste हो सकती है या Array छोटा पड़ सकता है। ऐसी स्थिति में Dynamic Memory Allocation द्वारा Run Time पर Students की वास्तविक संख्या के अनुसार Memory Allocate की जाती है। परीक्षा समाप्त होने के बाद delete[] द्वारा Memory Release कर दी जाती है। इससे Memory का Efficient Utilization होता है।
Working of Dynamic Memory Allocation
↓
Memory Requirement
↓
new Operator
↓
Heap Memory Allocated
↓
Program Uses Memory
↓
delete Operator
↓
Memory Released
Applications of Dynamic Memory Allocation
Dynamic Memory Allocation (DMA) का उपयोग आधुनिक Software Development में व्यापक रूप से किया जाता है। जब Program के Execution के दौरान Memory की आवश्यकता बदलती रहती है, तब Dynamic Memory Allocation सबसे उपयुक्त समाधान होता है।
| Application | Purpose |
|---|---|
| Linked List | Run Time पर नए Nodes Create करने के लिए। |
| Stack & Queue | Dynamic Size वाली Data Structures Implement करने के लिए। |
| Binary Tree | Nodes को आवश्यकता अनुसार Allocate एवं Delete करने के लिए। |
| Graph | Dynamic Vertices तथा Edges Store करने के लिए। |
| Database Systems | Variable Size Records एवं Data Management के लिए। |
| Operating Systems | Process एवं Memory Management के लिए। |
| Game Development | Characters, Maps तथा Resources को Dynamic रूप से Allocate करने के लिए। |
Advantages of Dynamic Memory Allocation
- Run Time पर आवश्यकता अनुसार Memory Allocate की जा सकती है।
- Memory का Efficient Utilization होता है।
- Large एवं Complex Data Structures आसानी से बनाए जा सकते हैं।
- Program अधिक Flexible तथा Scalable बनता है।
- Memory को आवश्यकता समाप्त होने पर पुनः Release किया जा सकता है।
- Dynamic Programming Techniques को Implement करना आसान होता है।
- Professional Enterprise Applications के लिए अत्यंत उपयोगी है।
Limitations of Dynamic Memory Allocation
- Memory Release न करने पर Memory Leak हो सकता है।
- Dangling Pointer की समस्या उत्पन्न हो सकती है।
- Heap Memory Fragmentation की संभावना रहती है।
- Memory Allocation एवं Deallocation में अतिरिक्त समय लगता है।
- Pointer Handling में त्रुटि होने पर Program Crash हो सकता है।
- Program की Complexity बढ़ सकती है।
- Memory Management पूरी तरह Programmer की जिम्मेदारी होती है।
Best Practices
- Memory Allocate करने के बाद हमेशा delete अथवा delete[] द्वारा Release करें।
- Memory Release करने के बाद Pointer को NULL अथवा nullptr Assign करें।
- Single Object के लिए delete तथा Array के लिए delete[] का उपयोग करें।
- Pointer को Initialize किए बिना उपयोग न करें।
- Memory Leak से बचने के लिए प्रत्येक Allocation का उचित Deallocation करें।
- Heap Memory का उपयोग केवल आवश्यकता होने पर करें।
- Code की Readability एवं Maintainability बनाए रखें।
Real Life Example
मान लीजिए किसी Hospital Management System में प्रतिदिन मरीजों (Patients) की संख्या अलग-अलग होती है। यदि पहले से Fixed Size Array बनाया जाए, तो या तो Memory Waste होगी अथवा Array छोटा पड़ जाएगा। ऐसी स्थिति में Dynamic Memory Allocation द्वारा Run Time पर आवश्यक संख्या के अनुसार Memory Allocate की जाती है। जब मरीजों का Data आवश्यक नहीं रहता, तब delete अथवा delete[] द्वारा Memory Release कर दी जाती है। इससे System Memory का सर्वोत्तम उपयोग करता है।
Working of Dynamic Memory Allocation
↓
Memory Requirement Identified
↓
new Operator
↓
Heap Memory Allocation
↓
Program Uses Memory
↓
delete / delete[]
↓
Memory Returned to Heap
Summary
Dynamic Memory Allocation (DMA) C++ का एक महत्वपूर्ण Feature है जिसके द्वारा Program के Execution Time (Run Time) पर Memory Allocate तथा Deallocate की जाती है। C++ में new Operator का उपयोग Heap Memory में Memory Allocate करने तथा delete Operator का उपयोग उस Memory को Release करने के लिए किया जाता है। Dynamic Memory Allocation की सहायता से Program आवश्यकता अनुसार Memory का उपयोग करता है, जिससे Memory Wastage कम होती है तथा बड़े एवं Dynamic Data Structures जैसे Linked List, Stack, Queue, Tree तथा Graph को आसानी से Implement किया जा सकता है। यदि Allocate की गई Memory को समय पर Release नहीं किया जाए, तो Memory Leak तथा Dangling Pointer जैसी समस्याएँ उत्पन्न हो सकती हैं।
| Concept | Description |
|---|---|
| Dynamic Memory Allocation | Run Time पर Memory Allocate एवं Deallocate करने की प्रक्रिया। |
| new Operator | Heap Memory में Memory Allocate करता है। |
| delete Operator | Allocate की गई Memory को Release करता है। |
| Heap Memory | Dynamic Memory Allocation के लिए उपयोग होने वाला Memory Area। |
| Stack Memory | Compiler द्वारा Automatically Managed Memory। |
| Memory Leak | Memory Allocate होने के बाद Release न होने की स्थिति। |
| Dangling Pointer | Released Memory को Point करने वाला Pointer। |
| Applications | Dynamic Arrays, Objects, Linked List, Tree, Graph एवं Database Systems। |
Important Viva Questions
- Dynamic Memory Allocation (DMA) क्या है?
- Static Memory Allocation तथा Dynamic Memory Allocation में क्या अंतर है?
- new Operator का क्या कार्य है?
- delete तथा delete[] में क्या अंतर है?
- Heap Memory क्या होती है?
- Memory Leak क्या है?
- Dangling Pointer क्या होता है?
- Dynamic Memory Allocation का उपयोग Linked List में क्यों किया जाता है?
- Dynamic Objects कैसे Create किए जाते हैं?
- Dynamic Memory Allocation के मुख्य Advantages क्या हैं?
University Examination Important Questions
- Dynamic Memory Allocation क्या है? उदाहरण सहित समझाइए।
- new तथा delete Operators को उदाहरण सहित समझाइए।
- Heap Memory तथा Stack Memory में अंतर लिखिए।
- Dynamic Memory Allocation द्वारा Array Allocate करने का Program लिखिए।
- Dynamic Object क्या है? उदाहरण सहित समझाइए।
- Memory Leak तथा Dangling Pointer में अंतर स्पष्ट कीजिए।
- Dynamic Memory Allocation के Advantages तथा Limitations लिखिए।
- Dynamic Memory Allocation के Applications लिखिए।
- Dynamic Two-Dimensional Array कैसे Allocate किया जाता है? उदाहरण सहित समझाइए।
- Professional Software Development में Dynamic Memory Allocation की आवश्यकता स्पष्ट कीजिए।
Exam Tips
- हमेशा याद रखें कि new Operator Memory Allocate करता है जबकि delete उसे Release करता है।
- Single Variable अथवा Object के लिए delete तथा Array के लिए delete[] का उपयोग करें।
- Heap Memory को Programmer स्वयं Manage करता है।
- Memory Release न करने पर Memory Leak उत्पन्न होता है।
- Released Memory को Point करने वाला Pointer Dangling Pointer कहलाता है।
- Memory Release करने के बाद Pointer को NULL अथवा nullptr Assign करना अच्छी Programming Practice है।
- RGPV Practical एवं Viva में new/delete, Dynamic Array तथा Dynamic Object के Programs अक्सर पूछे जाते हैं।
Conclusion
Dynamic Memory Allocation C++ Programming का अत्यंत महत्वपूर्ण Feature है जो Program को आवश्यकता अनुसार Run Time पर Memory Allocate एवं Deallocate करने की सुविधा प्रदान करता है। new तथा delete Operators की सहायता से Programmer Memory का Efficient Management कर सकता है। Linked List, Queue, Stack, Tree, Graph, Database Management Systems, Operating Systems तथा Game Development जैसे क्षेत्रों में Dynamic Memory Allocation का व्यापक उपयोग किया जाता है। Memory Leak एवं Dangling Pointer जैसी समस्याओं से बचने के लिए Allocate की गई Memory को समय पर Release करना तथा उचित Pointer Management अपनाना आवश्यक है। RGPV B.Tech First Year के विद्यार्थियों के लिए यह Topic Theory, Practical तथा Viva तीनों दृष्टिकोण से अत्यंत महत्वपूर्ण है।
Related Articles
Arrays of Objects in C++ Notes | Object Array, Declaration, Initialization & Examples | Basic Computer Engineering | RGPV BTech First Year
Arrays ...
Read More →Object as Function Argument & Returning Object from Function in C++ Notes | Pass Object to Function, Return Object & Examples | Basic Computer Engineering | RGPV BTech First Year
Object ...
Read More →Pointers to Objects in C++ Notes | Object Pointer, Accessing Members using Pointer & Examples | Basic Computer Engineering | RGPV BTech First Year
Pointer...
Read More →this Pointer in C++ Notes | this Keyword, Uses, Advantages & Examples | Basic Computer Engineering | RGPV BTech First Year
this Po...
Read More →Static Data Members & Static Member Functions in C++ Notes | Static Keyword, Static Variables, Static Functions & Examples | Basic Computer Engineering | RGPV BTech First Year
Static ...
Read More →