[fpc-devel] GetMem(SomePointer, 0) <> nil
Sergei Gorelkin
sergei_gorelkin at mail.ru
Tue Mar 1 15:25:52 CET 2011
Jonas Maebe пишет:
>
> On 01 Mar 2011, at 07:32, Paul Ishenin wrote:
>
>> I noticed today that if I want to allocate 0 bytes I get not a nil but
>> a valid pointer. Why?
>
> The current code that causes this comes from this (cvs) revision:
>
> revision 1.16
> date: 1999-09-17 19:14:12 +0200; author: peter; state: Exp; lines:
> +284 -966;
> + new heap manager supporting delphi freemem(pointer)
>
> I guess the reason was to be able to
> a) give a run time error if someone tries to do freemem(nil)
Delphi allows freemem(nil) without error, consistent with TObject.Free
> b) nevertheless allow freeing all pointers that have been allocated
> using getmem() (even if the size was 0 bytes), for backwards
> compatibility with FPC code from before that revision (FPC also returned
> a non-nil pointer in that case)
>
>> This is incompatible with delphi.
I remember a discussion some time ago, the conclusion was it's compatible with TP
rather than with Delphi.
>
> If it is changed, it will also require changes in cmem (and probably
> also in heaptrc), because at least on Mac OS X libc also returns a valid
> pointer for malloc(0).
>
Not necessary, if we have only one GetMem function (currently we have several - getmem, fpc_getmem,
getmemory and maybe something else, each calling MemoryManager independently) and write it like this:
if size=0 then
result := nil
else
result := MemoryManager.GetMem(size);
>> And I suppose cause crashes and memory leaks not only in my delphi
>> code which I'm porting to FPC/Lazarus.
>
> That sounds very much like badly written code.
>
Fully agree.
Sergei
More information about the fpc-devel
mailing list