Jonas Maebe wrote 16 lines
On 25 Mar 2008, at 18:54, Vincent Snijders wrote:
>Jonas Maebe schreef:
>>On 25 Mar 2008, at 18:30, Peter Vreman wrote:
>>>Current behaviour is compatible with TP7 that gave a valid pointer
>>>back pointing to heapend. See
>>>also the comment.
>>I thought so too, but I tested and TP7 stores nil in p when doing
>>getmem(p,0) (under DosBox).
>
>But AllocMem(0)?
AllocMem does not exist in TP7. And the code posted by the original
poster comes from SysGetMem, not from AllocMem (which is just a
wrapper for getmem+fillchar).
Yes. I tested GetMem and AllocMem in TP7.0, Delphi1, Delphi7, Kylix and all compillers returns nil when size is zero.
This patch solves it.
Index: inc/heap.inc
=================================================================== --- inc/heap.inc (revision 10368)
+++ inc/heap.inc (working copy)
@@ -991,10 +991,11 @@
function SysGetMem(size : ptruint):pointer;
begin
{ Something to allocate ? }
- if size=0 then
- { we always need to allocate something, using heapend is not possible,
- because heappend can be changed by growheap (PFV) }
- size := 1;
+ if size<=0 then
+ begin
+ result := nil;
+ exit;
+ end;
{ calc to multiple of 16 after adding the needed bytes for memchunk header }
if size <= (maxblocksize - sizeof(tmemchunk_fixed_hdr)) then
begin
But heaptrc will show unfreeed blocks with zero size. And this helps.
Index: inc/heaptrc.pp
===================================================================
--- inc/heaptrc.pp (revision 10368)
+++ inc/heaptrc.pp (working copy)
@@ -406,6 +406,11 @@
pp : pheap_mem_info;
loc_info: pheap_info;
begin
+ if size<=0 then
+ begin
+ TraceGetMem:=nil;
+ exit;
+ end;
loc_info := @heap_info;
try_finish_heap_free_todo_list(loc_info);
inc(loc_info^.getmem_size,size);
Are these patches acceptable?
Petr
Ing. Petr Kristan
.
EPOS PRO s.r.o., Bozeny Nemcove 2625, 530 02 Pardubice
tel: +420 466335223 Czech Republic (Eastern Europe)
fax: +420 466510709