[fpc-devel] Support needed in understanding some heap.inc related stuff

Nikolay Nikolov nickysn at users.sourceforge.net
Sun Sep 28 18:35:21 CEST 2014


On 09/28/2014 05:45 PM, Lag Programming wrote:
>    Hi! I need some help in understanding three things viewed in heap.inc.
>
> ...
> 3) I'm not interested in the importance of the presented function. Why 
> the "existing" code design is preferred over "alternative" code?
>
> Existing code:
> function SysAllocMem(size: ptruint): pointer;
> begin
>   result := MemoryManager.GetMem(size);
>   if result<>nil then
>     FillChar(result^,MemoryManager.MemSize(result),0);
> end;
>
> Alternative code:
> function SysAllocMem(size: ptruint): pointer;
> begin
> result:=MemoryManager.GetMem(size);
> if result<>nil then FillChar(result^,size,0);
> end;
>
> The only things I could find to support the "existing" code over 
> "alternative" code are that(now or in the future):
> a) Maybe there is a possibility that the value of variable size gets 
> changed after "result:=MemoryManager.GetMem(size);"
This cannot happen, because the 'size' parameter to MemoryManager.GetMem 
is passed by value, not by reference.
> b) Maybe there is a possibility that following 
> "result:=MemoryManager.GetMem(size);" variable result would point to a 
> memory block that has allocated a size different than variable 
> "size"'s content.
This could happen, at least in theory. Memory managers usually align 
memory block size up to some given granularity, so they often allocate 
more memory than you requested. The question is whether they save and 
return the original size in MemSize or the aligned (i.e. bigger) one. If 
they store the aligned size, it's a good idea, just in case, to clear 
all the memory up to that size.

Nikolay
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20140928/3db44d20/attachment.html>


More information about the fpc-devel mailing list