मैंने अभी सी ++ में एक कोड लिखा है जो कुछ स्ट्रिंग मैनिपुलेशन करता है, लेकिन जब मैं वाल्ग्रिंड चलाता हूं, तो यह कुछ संभावित मेमोरी लीक दिखाता है। बारीक स्तर के लिए कोड को डीबग करना मैं एक साधारण सी ++ प्रोग्राम लिखा था की तरह लग रही:मेमोरी लीक सी ++
#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
std::string myname("Is there any leaks");
exit(0);
}
और इस पर चल valgrind मुझे मिल गया:
==20943== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 26 from 1)
==20943== malloc/free: in use at exit: 360,645 bytes in 12,854 blocks.
==20943== malloc/free: 65,451 allocs, 52,597 frees, 2,186,968 bytes allocated.
==20943== For counts of detected errors, rerun with: -v
==20943== searching for pointers to 12,854 not-freed blocks.
==20943== checked 424,628 bytes.
==20943==
==20943== LEAK SUMMARY:
==20943== definitely lost: 0 bytes in 0 blocks.
==20943== possibly lost: 917 bytes in 6 blocks.
==20943== still reachable: 359,728 bytes in 12,848 blocks.
==20943== suppressed: 0 bytes in 0 blocks.
==20943== Reachable blocks (those to which a pointer was found) are not shown.
==20943== To see them, rerun with: --show-reachable=yes
तो यह मुझे मारा है कि हम जबरदस्ती बाहर आ गए हैं (जो मैं प्रदर्शन किया मेरे मूल सी ++ कोड में भी)। अब समस्या यह है कि मैं प्रोग्राम से बाहर निकलना चाहता हूं क्योंकि मेरा पिछला पुराना कोड नए कोड की निकास स्थिति के लिए इंतजार कर रहा है। उदाहरण के लिए binary a.out b.out की निकास स्थिति के लिए प्रतीक्षा करता है। मेमोरी लीक से बचने का कोई तरीका है, या मुझे वास्तव में मेमोरी लीक के बारे में चिंता करनी चाहिए क्योंकि कार्यक्रम उस बिंदु पर पहले ही बाहर निकल रहा है।
यह मेरे लिए एक और सवाल उठाता है, क्या ऐसा कोड हानिकारक है?
#include<stdio.h>
#include<cstdlib>
int main()
{
char *p=(char *)malloc(sizeof(char)*1000);
exit(0);
}
मुख्य() से मूल्य लौटने से आपकी प्रक्रिया के निकास कोड के रूप में उस मान का उपयोग किया जाएगा। – tinman
ध्यान दें कि, जैसा कि वाल्ग्रिंड सही ढंग से इंगित करता है, आपके पास इस मामले में कोई लीक संसाधन नहीं है। प्रक्रिया समय के अंत में आवंटित स्मृति के कुछ बाइट्स अभी भी पहुंच योग्य हैं (जिनके पास अभी भी एक सूचक है), लेकिन यह "रिसाव" नहीं है। –
जैसा कि आपने अब तक कोई संदेह नहीं पढ़ा है, "निकास निकालें;" "निकास (निकास कोड) से काफी बेहतर है;" क्योंकि, कार्यक्षमता वे दोनों निकास कोड स्थिति सेट करते हैं। "वापसी" सफाई का एक बेहतर काम करता है, जबकि, "निकास" सफाई को रोकने की संभावना है। –