c++ - Is this behaviour of delete[] expected - deleting only the first two elements? -
मेरा कोड:
# include & lt; iostream & gt; # शामिल करें & lt; cstdlib & gt; नेमस्पेस एसटीडी का उपयोग करना; Int main () {int * p; पी = नया इंट [5]; पी [0] = 34; पी [1] = 35; पी [2] = 36; पी [3] = 44; पी [4] = 32; Cout & lt; & lt; "हटाने से पहले:" & lt; & lt; endl; (इंट आई = 0; आई & lt; 5; i ++) के लिए {cout & lt; & lt; पी [आई] & lt; & lt; endl; } हटाएं [] पी; Cout & lt; & lt; "हटाए जाने के बाद:" & lt; & lt; endl; (इंट आई = 0; आई & lt; 5; i ++) के लिए {cout & lt; & lt; पी [आई] & lt; & lt; endl; }} यदि को हटाएं] को नया के द्वारा बनाई गई सभी स्मृति ब्लॉकों को हटाना चाहती हैं तो फिर केवल पहले दो तत्व यहां हटाए गए हैं? यह आउटपुट है:
हटाए जाने से पहले: 34 35 36 44 32 हटाए जाने के बाद: 0 0 36 44 32 एक संभावित कारण मैं सोच सकता था कि यह पहले दो को हटा देता है जो कुछ कैसे स्मृति प्रबंधन को सोचता है कि जब ज़रूरत होती है तो पूरे ब्लॉक फिर से आवंटित किए जाने के लिए स्वतंत्र है हालांकि यह मेरे भाग पर एक पूर्ण अनुमान है और मुझे वास्तविक कारण नहीं पता है।
यह है नहीं पहले दो आइटम हटाए गए, लेकिन उनमें से सभी उस मेमोरी क्षेत्र को अब और नए ऑपरेशन से पुन: उपयोग किया जा सकता है, लेकिन उस मेमोरी क्षेत्र में जो कुछ भी छोड़ा गया है उसकी कोई गारंटी नहीं है।
यह पूरी तरह से संभव है कि आप विभिन्न मशीनों के लिए अलग-अलग परिणाम देखेंगे, बाद में एक ही मशीन, विभिन्न संकलक संस्करण और इतने पर। बस उस पर भरोसा मत करो।
हालांकि, आप बाद में एक झंकारदार संकेतक तक पहुंच रहे हैं जो अपरिभाषित व्यवहार (शीघ्र ही यूबी) है।
बस यदि, कोष्ठक, सभी स्मृति को डी-आवंटित किया जाता है, लेकिन डिस्ट्रक्टर्स को नहीं कहा जा सकता है। यह भी यूबी है, भले ही आपके पास इस प्रकार के कस्टम प्रकार न हों, बस ints।
आपके मामले में, यह वही यूबी व्यवहार है जिसमें हटाएं के साथ ही < कोड> हटाएं [] , क्रमशः। यही कारण है कि आप अपने मौजूदा रनों के लिए दोनों ही मामलों में एक ही परिणाम देखते हैं, लेकिन फिर से, यहां तक कि इसकी भी गारंटी नहीं दी जाती है। आदर्श रूप से, आपको उन्हें शून्य पर सेट करना होगा, लेकिन वास्तव में, आप स्मार्ट पॉइंटर का उपयोग करने पर विचार करना चाहिए, जैसे।
Comments
Post a Comment