On 12/21/23 01:11, Hairy Pixels via fpc-pascal wrote:

On Dec 21, 2023, at 1:53 AM, Michael Van Canneyt via fpc-pascal 
<fpc-pascal@lists.freepascal.org> wrote:

If you look at the generated code, you see that there is an implicit 
try/finally block
and the  finally block does a finalize.
Maybe I misunderstood but I thought they were supposed to be balanced with init 
calls. Is it the design of the compiler to allow multiple finalize calls and 
have the user keep track of it the underlying structure is really finalized or 
not? If you were doing things like deleting memory in the finalizer you would 
have a double free happen here.

Note that you should also add an 'AddRef' and 'Copy' management operators and implement these as well. However, I think it's an FPC bug that Initialize is called twice in this case. I could be wrong, though.

If you assign the result to a local variable, i.e.:

var

  a: TManagedObject;

begin

  a := TManagedObject.Create;

end.

You get the following output:

Initialize
Initialize
Create
Copy
Finalize
Finalize

So, I think there's a bug in FPC that finalize is called twice when the return value is discarded.

Nikolay

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to