I’m having a problem with free() on a struct in my C program. When I look at /proc//statm before and after the free it doesn’t seem to reduce. Am I using free() wrong in this case, or am I reading /proc//statm wrong?
Here is a test case which yields the problem:
struct mystruct {
unsigned int arr[10000];
};
void mem() {
char buf[30];
snprintf(buf, 30, "/proc/%u/statm", (unsigned)getpid());
FILE* pf = fopen(buf, "r");
if (pf) {
unsigned size; // total program size
unsigned resident;// resident set size
unsigned share;// shared pages
unsigned text;// text (code)
unsigned lib;// library
unsigned data;// data/stack
unsigned dt;// dirty pages (unused in Linux 2.6)
fscanf(pf, "%u %u %u %u %u %u", &size, &resident, &share, &text, &lib, &data);
printf("Memory usage: Data = %d\n", data*sysconf(_SC_PAGESIZE));
}
fclose(pf);
}
int main(int argc, char **argv) {
mem();
struct mystruct *foo = (struct mystruct *)malloc(sizeof(struct mystruct));
mem();
free(foo);
mem();
}
The output is:
Memory usage: Data = 278528
Memory usage: Data = 282624
Memory usage: Data = 282624
When I would expect it to be:
Memory usage: Data = 278528
Memory usage: Data = 282624
Memory usage: Data = 278528
I’ve done a similar test with malloc’ing a (char *), then free’ing it and it works fine. Is there something special about structs?
Your answer is right over here on Stack Overflow, but the short version is that, for very good reasons, the memory allocator does not return memory to the host OS but keeps it (internally in your program’s data space) as a free list of some kind.
Some of the reasons the library keeps the memory are: