[Interest] memory fragmentation?

Till Oliver Knoll till.oliver.knoll at gmail.com
Wed Aug 22 08:30:29 CEST 2012


Am 22.08.12 05:45, schrieb Graeme Gill:
> Till Oliver Knoll wrote:
>> Folks, I gave up checking for NULL pointers (C, malloc) or bad_alloc
>> exceptions (new, C++) a long time ago. I remember a discussion several
>> years ago (here on Qt interest?) about desktop memory managers actually
>> never returning a NULL pointer (or throwing an exception) when they
>> cannot allocate memory.
>
> This is simply not true when it comes to malloc. Malloc can and does
> return NULL on MSWin, OS X and Linux. I have some code that
> uses as much RAM as possible for computation caching, and the simplest
> portable way of sizing the virtual memory space is to malloc memory
> until it returns NULL,

Now I got curious and just tried to allocate a Terrabyte (if my math 
serves me right ;))

   const size_t NofGigabyte = 1024;
   const size_t Gigabyte = 1024 * 1024 * 1024;
   char *ptr;

   ptr = (char *)malloc(NofGigabyte * Gigabyte);

This worked both with malloc (as above) and likewise with new[]! I got a 
valid pointer.

The next thing I did is actually try to use that memory:

   if (ptr) {
     for (size_t i; i < NofGigabyte * Gigabyte; ++i) {
       ptr[i] = i % 256;
     }
     free(ptr);
   }

With some debug statements in between, the process would happily start 
writing data into that allocated memory!

This is on Mac OS X 10.6.8 (Snow Leopard) with 4 GByte of physical RAM, 
and according to Activity Monitor with about 268 GB of Virtual Memory 
(which couldn't be used entirely, because my harddisk has much less free 
space).

According to Activity Monitor my "Memory Buster" process got allocated 
up to about 2 GByte of physical memory, after that the harddisk started 
spinning like crazy, as expected and the swap file grew. After 5 minutes 
I killed the process with Ctrl + C, but up to that point it was still 
happily filling my swap file with funny numbers. It was *not* killed by 
the OS.


However when I first ignored the compiler warning that a constant was 
overflowing when writing

   const size_t RidiculousSize = 1024 * 1024 * 1024 * 2;

(size_t is not the problem here, but the constant at the right of the = 
would overflow!)

only then did I get an exception, saying that 823....4 (lots of digits - 
a REALLY ridiculous large size) could not be allocated. So yes, there is 
a limit somewhere, but it must be FAR beyond my harddisk size ;)


Cheers, Oliver




More information about the Interest mailing list