मेरा प्रश्न ढेर स्मृति से सरणी हटाने के बारे में है। मैंने एक पुस्तक और this blog और अन्य संसाधन like this one पढ़ा, और उन सभी ने कहा कि ढेर से एक सरणी हटाने के लिए हमें के बाद का उपयोग करना चाहिए ताकि अगर हम []
का उपयोग किये बिना हमारे कोड लिखते हैं तो हमने स्मृति लीक की है।ढेर से सरणी हटाना
उदाहरण के लिए, मैं valgrind
पैकेज (इस पैकेज की जांच कर सकता है कि कितना लीक स्मृति बुरा कोडिंग द्वारा पैदा करता है) का उपयोग लिनक्स में .by आदेश नीचे से लिनक्स में इस छोटे से कार्यक्रम का परीक्षण किया कार्यक्रम
int *s = new int[10];
delete [] s;
नीचे पर विचार करें, हमने देखा कि सब कुछ ठीक
sudo valgrind --leak-check=full ./<path_to_exe_file>
यहाँ
है लिनक्स कमांड के उत्पादन में
==4565== HEAP SUMMARY:
==4565== in use at exit: 0 bytes in 0 blocks
==4565== total heap usage: 1 allocs, 1 frees, 40 bytes allocated
==4565==
==4565== All heap blocks were freed -- no leaks are possible
लेकिन मेरा प्रश्न तब दिखाई दिया जब मैं का उपयोग किए बिना []
का उपयोग किए बिना और valgrind
के आउटपुट की जांच करता हूं, मैंने देखा कि सभी ढेर स्मृति मुक्त हो गई है, तो क्या यह सही है? या valgrind
पता नहीं था कि पूरे ढेर को मुक्त नहीं किया गया है और सरणी का कुछ हिस्सा अभी भी वहां है !!?? और यदि valgrind
इस प्रकार की लीक मेमोरी का पता नहीं लगा सका तो क्या कोई पैकेज है जो इसका पता लगा सकता है।
'int * s = new int [10]; एस हटाएं; 'अपरिभाषित व्यवहार देता है। ऑपरेटर 'डिलीट' के रूप में ऑपरेटर 'नए' के रूप से मेल खाना चाहिए। अपरिभाषित व्यवहार का एक संभावित अभिव्यक्ति चल रहा है जैसा कि आप उम्मीद करते हैं, जैसे आप देख रहे हैं। एक और कंपाइलर के साथ, यह अलग-अलग चला सकता है, या बिल्कुल नहीं। – Peter
'हटाएं' जो आप 'नया'-एड करते हैं और 'हटाएं []' जिसे आप नया करते हैं [] '-ed। या इसके बजाय स्मार्ट पॉइंटर्स का बेहतर उपयोग करें। – Ron
अपने यूबी कार्यक्रम में अपेक्षित रिसाव देखने के लिए 'int'' std :: vector 'या' std :: string' द्वारा बदलें। –
Jarod42