example - C++ में बनाम NULL बनाम फ्री डिलीट करें



directives and (4)

आपका प्रश्न बताता है कि आप उस भाषा से आते हैं जिसमें कचरा संग्रह है। C ++ में कचरा संग्रह नहीं है।

यदि आप NULL के लिए एक पॉइंटर सेट करते हैं, तो यह मेमोरी को उपलब्ध मेमोरी के पूल में वापस जाने का कारण नहीं बनता है। यदि कोई अन्य संकेत मेमोरी के इस ब्लॉक की ओर इशारा नहीं करता है, तो आपके पास अब मेमोरी का एक "अनाथ" ब्लॉक है जो आवंटित रहता है लेकिन अब अप्राप्य है - एक रिसाव । लीक्स केवल एक प्रोग्राम को क्रैश करने का कारण बनता है यदि वे उस बिंदु तक बनाते हैं जहां कोई मेमोरी आवंटित करने के लिए नहीं बची है।

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

[संपादित करें] जैसा कि stinky472 उल्लेख करता है, delete और free() बीच एक और अंतर यह है कि केवल पूर्व वस्तु के डिस्ट्रक्टर को कॉल करता है। (याद रखें कि आपको new साथ आवंटित ऑब्जेक्ट पर delete को कॉल करना होगा, और malloc() साथ आवंटित मेमोरी के लिए free() - malloc() मिलाया नहीं जा सकता।) C ++ में, यदि संभव हो तो स्थैतिक आवंटन का उपयोग करना हमेशा अच्छा होता है, लेकिन यदि नहीं, तो malloc() लिए new पसंद करें।

https://src-bin.com

पॉइंटर को हटाने, उसे शून्य करने और उसे मुक्त करने के बीच क्या अंतर है।

delete ptr;

बनाम

ptr=NULL;

बनाम

free(ptr);

Answer #1

किसी भी अप्रत्यक्ष के साथ, पॉइंटर्स का उपयोग करते समय दो ऑब्जेक्ट शामिल होते हैं: रेफ़रर (पॉइंटर, आपके उदाहरण में ptr ) और संदर्भित ऑब्जेक्ट (यह क्या इंगित करता है, *ptr )। आपको उनके बीच अंतर करना सीखना होगा।

जब आप NULL को एक पॉइंटर असाइन करते हैं, तो केवल पॉइंटर प्रभावित होता है , जिस ऑब्जेक्ट को संदर्भित करता है वह अकेला छोड़ दिया जाता है। यदि पॉइंटर उस ऑब्जेक्ट की ओर इशारा करने वाला अंतिम था, तो आपने पिछले रेफरिंग पॉइंटर को इंगित करते हुए खो दिया है और इस प्रकार वह अब उपयोग नहीं कर सकता है। C ++ में, हालांकि, इसका मतलब यह नहीं है कि ऑब्जेक्ट हटा दिया जाएगा । C ++ में कचरा संग्रह नहीं है। तो वस्तु लीक हो जाती है

ऑब्जेक्ट को हटाने के लिए, आपको delete ऑपरेटर को अपना पता (एक पॉइंटर में संग्रहीत) पास करके मैन्युअल रूप से उन्हें हटाना होगा। यदि आप ऐसा करते हैं, तो केवल संदर्भित ऑब्जेक्ट प्रभावित होगा, सूचक अकेला छोड़ दिया गया है। यह अभी भी उस पते की ओर इशारा कर सकता है जहां ऑब्जेक्ट मेमोरी में रहता था, भले ही वह अब उपयोग करने योग्य नहीं है। इसे डैंगलिंग पॉइंटर कहा जाता है।


Answer #2

ठीक है, अगर आपने गतिशील रूप से ('नए' के ​​साथ) ऑब्जेक्ट बनाया है, तो किसी भी मान के लिए पॉइंटर सेट करने से मेमोरी से ऑब्जेक्ट डिलीट नहीं होता है - और आपको मेमोरी लीक मिलता है।


Answer #3

delete मैमोरी वापस C ++ रनटाइम लाइब्रेरी को देगी। आपको हमेशा एक new मिलान की आवश्यकता होती है, जो पहले ढेर पर मेमोरी आवंटित करता था। NULL कुछ पूरी तरह से अलग है। एक "प्लेसहोल्डर" यह संकेत देने के लिए कि यह बिना पते के इंगित करता है। C ++ में, NULL एक MACRO है जिसे 0 रूप में परिभाषित किया गया है। तो अगर MACROS पसंद नहीं है, तो सीधे 0 का उपयोग करना भी संभव है। C ++ में 0x nullptr पेश किया गया है और बेहतर है।

उदाहरण:

int* a;        //declare pointer
a = NULL;      //point 'a' to NULL to show that pointer is not yet initialized 
a = new int;   //reserve memory on the heap for int

//... do more stuff with 'a' and the memory it points to

delete a;      //release memory
a = NULL;      //(depending on your program), you now want to set the pointer back to
               // 'NULL' to show, that a is not pointing to anything anymore




c