[fpc-devel] Why/how does the compiler have a non-trivial number ofmemory leaks after over two decades of development?
Thorsten Engler
thorsten.engler at gmx.net
Mon Jul 30 14:40:27 CEST 2018
From: fpc-devel <fpc-devel-bounces at lists.freepascal.org> On Behalf Of Marcos Douglas B. Santos
Sent: Monday, 30 July 2018 22:25
To: FPC developers' list <fpc-devel at lists.freepascal.org>
Subject: Re: [fpc-devel] Why/how does the compiler have a non-trivial number ofmemory leaks after over two decades of development?
On Mon, Jul 30, 2018 at 9:14 AM, Sven Barth via fpc-devel <fpc-devel at lists.freepascal.org <mailto:fpc-devel at lists.freepascal.org> > wrote:
J. Gareth Moreton <gareth at moreton-family.com <mailto:gareth at moreton-family.com> > schrieb am Mo., 30. Juli 2018, 13:31:
I've noticed that the compiler doesn't use
try...finally blocks to help with freeing
blocks. I'm not sure why this is the case,
but might be speed related.
Correct. Even implicit try-finally frame generation is disabled for the compiler source.
Is performance more important than being correct? :|
Freeing memory is irrelevant if your process is going to exit anyway right after freeing it. The OS doesn’t care about any memory your process has allocated at that time. All pages go back into the available pool.
Depending on how the allocation/free behaviour of the compiler looks like, but it might even make sense to use a memory manager that doesn’t even know how to free memory.
(I’m using windows terminology here, but I’m sure equivalent can be found on other platforms)
Reserve a large block of address space.
Install a vectored exception handler that reacts to an access violation that falls inside the reserved block by committing the memory between start and error address + 1MB (or more or less).
Naïvely and without error checking, Alloc gets reduced to:
var
CurrentPtr: PByte;
function Alloc(Size: Integer):Pointer;
begin
Size := (Size + 3) and not 3; //adjust depending on what allocation alignment is desired;
If Size > 0 then begin
Result := CurrentPtr;
CurrentPtr := CurrentPtr + Size;
end else
Result := nil;
end;
procedure Free(p: Pointer);
begin
{do nothing}
end;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20180730/78f9ca7d/attachment.html>
More information about the fpc-devel
mailing list