delete Operator in C++

delete Operator in C++: new Operator Memory Reserve करता है। यदि इस Reserve की गई Memory को Free ना किया जाए, तो एक ऐसा समय आ सकता है, जब Heap Area में नए Memory Block बनाने के लिए जगह ही ना बचे। इस स्थिति में Program Crash हो सकता है। इसलिए new Operator द्वारा Reserve की गई Memory Block को काम पूरा हो जाने के बाद Free या Release करने के लिए delete Operator का प्रयोग किया जाता है।

Delete Operator “C” के free() Function के समान ही काम करता है। इसे Use करने का Statement निम्नानुसार होता है:

delete[] ptr;

इस Statement से ptr के लिए जो भी Memory Reserve की गई थी, वह Free हो जाती है, जिसका प्रयोग Computer किसी दूसरे Program के लिए कर सकता है।

वास्तव में इस Example में delete की कोई जरूरत नहीं है क्योंकि जैसे ही Program Terminate होता है, Memory Automatically Release हो जाती है।  लेकिन मानलो कि हमने एक Function में new का प्रयोग किया।

यदि Function एक Local Variable को Pointer Variable की तरह इस नए Create होने वाले Memory Block को Point करने के लिए Use करता है, तो जब Function Terminate होता है, तब Pointer तो Destroy हो जाता है, लेकिन Memory अभी भी Program द्वारा Reserved रहती है। बल्कि Memory इस स्थिति में चली जाती है कि उसे कोई भी Program कभी भी Use नहीं कर सकता है। इसलिए हमेंशा new Operator से Create किए गए Memory Block को काम पूरा हो जाने के बाद delete Operator से Delete कर देना चाहिए।

Memory को Delete करने पर वह Pointer Delete नहीं होता है जो Delete होने वाले Memory Block को Point कर रहा होता है, ( जैसाकि हमारे इस उदाहरण में str है ) और ना ही Pointer के Address Value का मान Change होता है। लेकिन ये Address Memory के Release होने के बाद Valid नहीं रहता है बल्कि पूरी तरह से किसी अलग मान वाली किसी Memory को Point करने लगता है। इसलिए जिस Pointer की Memory को Delete कर दिया गया है, उस Pointer को फिर Use नहीं करना चाहिए।

Delete के बाद का Bracket बताता है कि हम एक Array द्वारा Reserve किए गए Memory Block को Release कर रहे हैं। यदि हम new Operator द्वारा केवल एक Variable Create करें, तो हमें इस Bracket की जरूरत नहीं होती है। उदाहरण के लिए

 ptr = new int;  // allocate a single int variable

	. . .

 delete ptr;     // no brackets following delete

लेकिन यदि हम किसी Objects के Array को delete करते हैं, तो हमें निश्चित रूप से इस Bracket का प्रयोग करना ही होता है। ऐसा करने पर Array के सभी Elements Delete हो जाते हैं और हर Object का Destructor Call हो जाता है। यदि हम इसका प्रयोग नहीं करते हैं, तो Array का केवल पहला Object ही Delete होता है।

new Operator का प्रयोग सामान्‍यतया Constructors में किया जाता है। हम यहां पर वापस से xString Class का उदाहरण देख रहे हैं। अभी तक हमने जिन xString Classes को देखा है, उन सभी में xString के जितने भी Object Create किए जाते हैं, वे सभी समान Memory Reserve करते हैं।

जब String छोटी होती है तब कुछ Memory Waste होती है और यदि String ज्यादा बडी हो तो Program Crash हो सकता है। इस स्थिति में हम new Operator का प्रयोग करके Memory को Waste होने से बचा सकते हैं। इसी तथ्; को निम्न Program द्वारा समझाया जा रहा है।

// using new to get memory for strings
#include <iostream.h>
#include <string.h>      	// for strcpy(), etc
#include <conio.h>

class xString            	// user-defined string type
{
	private:
		char* str;                    	// pointer to string
	public:
		xString(char* s)              	// constructor, one arg
		{
			int length = strlen(s);    	// length of string argument
			str = new char[length+1];  	// get memory
			strcpy(str, s);            	// copy argument to it
		}

		~xString()                    	// destructor
		{
			delete[] str;              // release memory
		}

		void display()                	// display the xString
		{
			cout << str;
		}
};  // end class xString

void main()
{                                 	// uses 1-arg constructor
	xString s1(“Who knows nothing doubts nothing.”);
	cout << endl << “s1=";            	// display string
	s1.display();
	getch();
}

xString की इस Modified Class में एक ही Data Item है जो कि एक Pointer to char है, जिसे str नाम दिया गया है। ये Pointer उस सामान्‍य String को Point करता है जो Object में उपस्थित होती है। लेकिन String को Hold करने के लिए इस Class में कोई Array नहीं है। String Memory में कहीं और Store होता है और उस String का केवल Pointer इस Class में Data Member की तरह Use हो रहा है।

इस उदाहरण में एक 1-Argument Constructor है जो कि एक Normal String (char *) Argument के रूप में लेता है। ये Constructor new Operator का प्रयोग करके Memory में String को Store करने के लिए Space Reserve करता है और Data Member str को इन Newly Created Memory Block को Point करने के लिए Set कर देता है। यानी str इन नए Create हुए Memory Block को Point करता है। फिर Constructor उस String को strcpy() Library Function द्वारा उन नए Create किए गए Memory Block में Copy कर देता है।

पिछले उदाहरणों में हमने Destructors का प्रयोग नहीं किया है, लेकिन चूंकि इस उदाहरण में new Operator द्वारा Memory Allocate किया जा रहा है, इसलिए Destructors को इस Class में Define करना जरूरी हो जाता है।

यदि हम Object को Create करते समय उसे Memory Allocate करते हैं, तो ये जरूरी हो जाता है, कि जब उस Object की जरूरत ना हो तब उस Object द्वारा Reserve की गई Memory को भी Release किया जाए और Destructor Automatically Object को Destroy करने पर Automatically Call हो कर यही काम करता है। ये Destructor Operating System को Object द्वारा Reserve की गई Memory Return करता है।

Objects भी अन्‍य Local Variables की तरह तब Destroy होते हैं, जब Function Terminate होता है।Destructor को Define करने पर ये निश्चित हो जाता है, कि Object द्वारा Reserve की गई Memory वापस Operating System को प्राप्त हो जाएगी।  

यदि इस Program Destructor को Use ना किया जाए, तो कुछ Memory तब तक के लिए Inaccessible हो जाएगी जब तक कि Computer को Reboot ना किया जाए और यदि बार-बार इसे Repeated किया जाए यानी बिना Destructor के new Operator द्वारा Memory Block बनाया व Use किया जाए, तो “Memory Leak” की समस्या हो जाएगी और हमारा Program Crash हो जाएगा। 

इस xString Class की एक समस्या ये है कि यदि हम एक xString Object को दूसरे में String2 = String1 Statement द्वारा Copy करें, तो वास्तव में हम Actual String के केवल pointer (char*) को ही Copy कर रहे होते हैं, क्योंकि Object में केवल ये Pointer to String ही Data Member है। इसलिए इस Statement के कारण दोनों Objects String2 व String1 अब एक ही String को Point करने लगते हैं।  

लेकिन यदि xString Object को Delete कर दें, तो Destructor char* String को Delete कर देता है। जिससे वह दूसरा Object जो कि समान String को Point कर रहा होता है, अब एक Invalid Pointer वाला Object बन कर रह जाता है। ऐसा इसलिए होता है क्योंकि Objects हमेंशा एक अस्पष्‍ट तरीके से तब Destroy होते हैं, जब वह Function जिसमें Local Object Create हुआ था, Terminate होता है। (delete Operator in C++

CPP Programming Language in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook C++ Programming Language in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

C++ Programming Language in Hindi | Page: 666 | Format: PDF

BUY NOW GET DEMO REVIEWS