c++ - Why can I access the member variable of an object in a list after it has been erased? -


<पूर्व> #include & lt; सूची & gt; # शामिल करें & lt; iostream & gt; संरचना फू {फू (इंट ए): एम_ए (ए) {} ~ Foo () {std :: cout & lt; & lt; "फू डिस्ट्रक्टर" & lt; & lt; std :: endl; } Int m_a; }; Int main () {std :: सूची & lt; Foo & gt; ए; फू बी (10); Std :: cout & lt; & lt; & Amp; बी & lt; & lt; std :: endl; a.push_back (ख); फू * सी = & amp; (* a.begin ()); Std :: cout & lt; & lt; सी & lt; & lt; std :: endl; a.erase (a.begin ()); Std :: cout & lt; & lt; A.size () & lt; & lt; std :: endl; सी-> एम_ए = 20; Std :: cout & lt; & lt; सी- & gt; एम_ए & lt; & lt; std :: endl; Std :: cout & lt; & lt; बी.एम_ए & lt; & lt; std :: endl; }

इसका परिणाम है:

  0x7fff9920ee70 0x1036020 फू डिस्ट्रक्टर 0 20 10 फ़ू डिस्ट्रक्टर  

मैं आमतौर पर इसके बाद सोचता हूं मैं किसी ऑब्जेक्ट को सूची में मिटा देता हूं, मैं थर ऑब्जेक्ट के सदस्य वैरिएबल को और भी नहीं एक्सेस कर सकता हूं। लेकिन उपरोक्त में मैं अभी भी c को इंगित कर सकता हूं, क्यों?

>

के साथ Foo * c = & amp; (* a.begin ()); आपने एक ऑब्जेक्ट के लिए एक पॉइंटर बनाया है जिसे आप जानबूझकर नष्ट करते हैं ( मिटाना () के माध्यम से) हालांकि वस्तु के लिए स्मृति अभी भी वहाँ है (क्योंकि यह एक बहुत ही सरल अनुप्रयोग है, और ओएस ने इसके लिए कुछ और दावा नहीं किया है)।

इसलिए आप प्रभावी रूप से स्मृति का उपयोग करते हैं जो कि आपके उपयोग के लिए अब नहीं है।


Comments