C malloc and free

I was taught that if you do malloc(), but you don't free(), the memory will stay taken until a restart happens. Well, I of course tested it. A very simple code:

#include <stdlib.h>

int main(void)
{
    while (1) malloc(1000);
}

And I watched over it in Task Manager (Windows 8.1).

Well, the program took up 2037.4 MB really quickly and just stayed like that. I understand it's probably Windows limiting the program.

But here is the weird part: When I closed the console, the memory use percentage went down, even though I was taught that it isn't supposed to!

Is it redundant to call free, since the operating system frees it up anyway?

(The question over here is related, but doesn't quite answer whether I should free or not.)


On Windows, a 32 bit process can only allocate 2048 megabytes because that's how many addresses are there. Some of this memory is probably reversed by Windows, so the total figure is lower. malloc returns a null pointer when it fails, which is likely what happens at that point. You could modify your program like this to see that:

#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    int counter = 0;
    while (1) {
        counter++;
        if (malloc(1000) == NULL) {
            printf("malloc failed after %d callsn", counter);
            return 0;
        }
    }
}

Now you should get output like this:

$ ./mem
malloc failed after 3921373 calls

When a process terminates or when it is terminated from the outside (as you do by killing it through the task manager), all memory allocated by the process is released. The operating system manages what memory belongs to what process and can therefore free the memory of a process when it terminates. The operating system does not however know how each process uses the memory it requested from the operating system and depends on the process telling it when it doesn't need a chunk of memory anymore.

Why do you need free() then? Well, this only happens on program termination and does not discriminate between memory you still need and memory you don't need any more. When your process is doing complicated things, it is often constantly allocating and releasing memory for its own computations. It's important to release memory explicitly with free() because otherwise your process might at some point no longer be able to allocate new memory and crashes. It's also good programming practice to release memory when you can so your process does not unnecessarily eat up tons of memory. Instead, other processes can use that memory.


It is advisable to call free after you are done with the memory you had allocated, as you may need this memory space later in your program and it will be a problem if there was no memory space for new allocations. You should always seek portability for your code.If windows frees this space, may be other operating systems don't.


Every process in the Operating System have a limited amount of addressable memory called the Process Address Space. If you allocate a huge amount of memory and you end up allocating all of the memory available for this process, malloc will fail and return NULL. And you will not be able to allocate memory for this process anymore.

链接地址: http://www.djcxy.com/p/80406.html

上一篇: 如何在64中使用malloc和free

下一篇: C malloc和免费