This is a followup to the question I just asked here.
I’ve created a simple program to help myself understand memory allocation, malloc() and free(). Notice the commented out free line. I created an intentional memory leak so I can watch the Windows reported “Mem Usage” bloat slowly to 1GB. But then I found something stranger. If I comment out the loop just above the free line, so that I don’t initialize my storage block with random ints, it appears that the space doesn’t actually get “claimed” by the program, from the OS. Why is this?
Sure, I haven’t initialized it the block, but I have claimed it, so shouldn’t the OS still see that the program is using 1GB, whether or not that GB is initialized?
#include <stdio.h>
#include <stdlib.h>
void alloc_one_meg() {
int *pmeg = (int *) malloc(250000*sizeof(int));
int *p = pmeg;
int i;
// for (i=0; i<250000; i++) /* removing this loop causes memory to not be used? */
// *p++ = rand();
// free((void *)pmeg); /* removing this line causes memory leak! */
}
main()
{
int i;
for (i=0; i<1000; i++) {
alloc_one_meg();
}
}
Allocated memory can be in two states in Windows: Reserved, and Commited (see the documentation of
VirtualAllocaboutMEM_RESERVE:"Reserves a range of the process's virtual address space without allocating any actual physical storage in memory or in the paging file on disk.").If you allocate memory but do not use it, it remains in the Reserved state, and the OS doesn’t count that as used memory. When you try to use it (whether it is only on write, or on both read and write, I do not know, you might want to do a test to find out), it turns into Commited memory, and the OS counts it as used.
Also, the memory allocated by
mallocwill not be full of 0’s (actually it may happen to be, but it’s not guaranteed), because you have not initialised it.