2012-08-07 13 views
7

मैं बहुत की तरह एक सूचक है:क्या कोई पॉइंटर हटाना स्मृति को हटा देता है जो यह इंगित कर रहा है?

int *test = new int; 

और मैं एक और सूचक कि इतने तरह test के लिए अंक बनाने के लिए:

int *test2 = test; 

तब मैं test2 हटाएँ:

delete test2; 

कि क्या इसका मतलब है कि यह test की स्मृति को भी हटा देगा, या मुझे delete test भी कॉल करना होगा ?

+3

आप वास्तव में "पॉइंटर हटाएं" नहीं करते हैं, तो आप इसे स्मृति * * को मुक्त करते हैं। –

उत्तर

13

हां, स्मृति हटा दी जाएगी दोनों पॉइंटर्स एक ही स्मृति को इंगित करते हैं।

इसके अलावा, test अब एक झूलने सूचक हो जाएगा (के रूप में होगा test2) और अपसंदर्भन यह अपरिभाषित व्यवहार का परिणाम देगा।

+0

ठीक उत्तर के लिए धन्यवाद और मुझे विश्वास है कि आपने मेरे अंतिम प्रश्न का उत्तर दिया है। तो अगर मेरे पास कोई फ़ंक्शन है और मैं इसे इस फंक्शन (नया चाइल्डक्लास) की तरह कॉल करता हूं और यदि मेरे पास उस पॉइंटर को उस शून्य में फ़ंक्शन (बेस क्लास * इंस्टेंस) {childInstance = instance; } अगर मैं बच्चे को हटा देता हूं तो यह इंस्टेंस पैरामीटर को भी हटा देगा और इसलिए कोई मेमोरी लीक नहीं होगी? – user1583115

+0

@ उपयोगकर्ता 1583115 हां। –

+0

इसके अलावा, "एक डबल डिलीट" (एक ही मेमोरी को दो बार मुक्त करने की कोशिश कर रहा है) अपरिभाषित व्यवहार है। –

5

आपने कभी भी test के लिए मेमोरी हटा दी है, और न ही आप test2 के लिए मेमोरी हटाते हैं। एकमात्र चीज जो कभी भी हटा दी जाती है वह ऑब्जेक्ट*test है, जो ऑब्जेक्ट *test2 (पॉइंटर्स समान हैं) के समान है, और इसलिए आपको इसे केवल एक बार हटा देना होगा।

यह एक बहुत ही आम है और बहुत दुर्भाग्यपूर्ण मिथ्या नाम है कि प्रसारित और सी के लिए नए लोगों के मन लूट ++ है: एक अक्सर की "एक सूचक को मुक्त" या "एक सूचक को हटाने", जब आप वास्तव में मतलब है "के लिए स्मृति को मुक्त कराने के बोलचाल की भाषा में बोलता है जो मेरे पास एक पॉइंटर है ", या" ऑब्जेक्ट को हटा रहा है जिसमें मेरे पास पॉइंटर है "। यह सच है कि प्रासंगिक निर्माण (यानी std::free और delete) उनके तर्क को इकाई में एक सूचक के रूप में लेते हैं, लेकिन इसका मतलब यह नहीं है कि सूचक स्वयं पर संचालित होता है - यह केवल स्थान की वस्तु के संचार से संचार करता है ब्याज।

संबंधित मुद्दे

 संबंधित मुद्दे