Should GC.realloc(null, N) be the equivalent of GC.calloc or GC.malloc?

Rainer Schuetze via Digitalmars-d digitalmars-d at puremagic.com
Thu Jul 17 15:35:16 PDT 2014



On 17.07.2014 23:52, Ali Çehreli wrote:
> When called with an existing buffer, GC.realloc conditionally clears the
> newly extended part of the memory. An excerpt from druntime/src/gc/gc.d:
>
> void *realloc(void *p, size_t size, uint bits = 0, size_t *alloc_size =
> null, const TypeInfo ti = null) nothrow
> {
>      // ...
>
>      if (p !is oldp && !(bits & BlkAttr.NO_SCAN))
>      {
>          memset(p + size, 0, *alloc_size - size);
>      }
>
>      return p;
> }
 >
 > (Disclaimer: Although undocumented, I assume that clearing the memory 
 > is an intended feature of GC.realloc.)
 >

It clears the memory beyond the requested size. This is usually not 
accessible to the user (at least if he didn't provide the alloc_size 
parameter).

I believe this is meant to avoid false pointers in the memory range that 
the user will not fill with other data. It is not meant to mimick calloc.



More information about the Digitalmars-d mailing list