Memory leaks will cause your device to crash after a period of time once it runs out of memory.
A quick way to find out if your application has a memory leak(s) is to monitor it with top:
1 2 |
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 15 0 2156 668 572 S 0 5 .0 0:00.14 application |
If you see the %MEM increase over time for no particular reason, then you’ve got a memory leak.
However, it might be tricky to isolate where the issue occurs exactly.
The first thing to do is the review your source code for the following:
- Malloced memory is always freed
- fopen is always followed by fclose, and open by close
- scandir calls are properly freed
- Threads are properly terminated with pthread_cancel & pthread_join or pthread_detach, etc…
If after a code review you cannot find the reason for the memory leak, use the following piece of code:
1 2 3 4 5 6 7 8 9 10 11 12 |
int return_process_memory_usage(void) { char buf[64]; int fd = open("/proc/self/statm", O_RDONLY); if(fd < 0) { return -1; } read(fd, buf, sizeof(buf)); close(fd); return atoi(buf); } #define DISPLAY_MEMORY_USAGE fprintf(stderr, "Memory usage: %d pages\n", return_process_memory_usage); |
The memory usage is displayed in numbers of pages. Usually, one page is 4096 bytes but it obviously depends on your system.
After you added this debug code, insert the macro DISPLAY_MEMORY_USAGE at strategic places in your code (e.g. before a thread starts and after it stops) to find out where the memory leak occurs. Then run the code and check the log to locate the issue.
Once you’ve located where the memory leak occurred, narrow down your search by adding more DISPLAY_MEMORY_USAGE in your code and remove the unused ones until you finally pinpoint the exact place in your code and resolve the issue.
Jean-Luc started CNX Software in 2010 as a part-time endeavor, before quitting his job as a software engineering manager, and starting to write daily news, and reviews full time later in 2011.
Support CNX Software! Donate via cryptocurrencies, become a Patron on Patreon, or purchase goods on Amazon or Aliexpress
I have already located the area of code where memory is not freeing, though I am not allocating any dynamic memory in my code, still I have don’t know what is the exact reason for memory leak??
@nitin Kumar
Some standard C functions allocate memory for you, and if you don’t call the right functions to free memory, a memory leak may occur. This happen to me once with directory listing (with dirent.h, I think). I did not call malloc or free directly, but these functions did, and I did not do the clean up correctly.
thanks, let me explain you in detail about the issue, We are doing FTP from one unit to another, This we are doing step by step so after receiving file in one module I am transferring it to next module right after which I am deleting the file though file system is showing file is not there but there is no difference in free memory before and after deletion. And after a few iterations it is showing “double free or corruption” and application is terminating. Moreover I have tried with a test application and repeated same procedure on same board that time it is working perfectly.