28 ms·
Generally modern operating systems free any memory left that the program is not using, but is still accessible. However, if you overwrite an old pointer, there
by omra 14y ago
Generally modern operating systems free any memory left that the program is not using, but is still accessible. However, if you overwrite an old pointer, there is no way that the operating system could catch that.
To illustrate the difference, I wrote two quick programs.
This one has memory that the OS can recover:
#include <stdlib.h>
int main(void) {
char *a = malloc(10);
return 0;
}
This one has memory that the OS cannot recover:
#include <stdlib.h>
int main(void) {
char *a = malloc(10);
a = malloc(10);
return 0;
}
- mikeash 14y agoSo if you run your second example a billion times or so, your OS will run out of RAM? No, that's not how it works....
- Jare 14y agoTo get rid of the hard memory leak in the second example, just call free(a) twice before returning. They don't call it pointer magic for nothing! /sarcasm
- humbledrone 14y agoThe OS always recovers all of the memory from a process that has terminated (barring horrible kernel bugs), and it doesn't need to look through the process image for pointers that need to be freed. When a process allocates memory, the kernel doesn't give it a physical memory address. It gives it a virtual address, which, when accessed, will be mapped to some physical address. The kernel has to keep track of which virtual addresses map to which physical addresses for each process, and it stores these mappings in a data structure called a "page table". At all times, the kernel knows what memory segments are in use by a given process. So, when a process exits, the kernel can just look at its page table to see what memory had been allocated to it. Provided that no other processes shared the same memory, it can free it.