[fpc-devel] Need patch for bugs : 0011503 / 0009472
Jonas Maebe
jonas.maebe at elis.ugent.be
Thu Jun 19 15:51:29 CEST 2008
On 19 Jun 2008, at 15:20, Boian Mitov wrote:
> never call Free() on interfaced object. I surely know that if I
> have used interfaces for the last 10 years or so ;-) .
> What I need is a way to make sure that all the references are gone.
> This is the first non garbage collected compiler that has prevented
> me from releasing all the references so far. Delphi, the C++ COM
> libraries VB etc. they all have behaved in a predictable way.
Delphi doesn't, look at this example:
***
uses
SysUtils;
type
imyintf = interface
function getrefcount: longint;
end;
tmyclass = class(tinterfacedobject,imyintf)
function getrefcount: longint;
end;
function tmyclass.getrefcount: longint;
begin
result:=refcount;
end;
procedure test;
var
i: imyintf;
function test2: imyintf;
begin
result:=tmyclass.create;
writeln(i.getrefcount);
end;
begin
i:=tmyclass.create;
i:=test2;
writeln(i.getrefcount);
end;
begin
test;
end.
***
The output is (when compiled with Kylix 3):
refcount of i in test2: 1
refcount of i after calling test2: 2
If you comment out the "writeln" in test2, then the result is:
refcount of i after calling test2: 1
The reason is that if you access "i" inside test2, then Delphi cannot
perform the optimisation of skipping the temp, and it also only frees
the temp at the end of the function.
The behaviour you are counting on is a side effect of an optimisation,
not a behaviour by design.
Jonas
More information about the fpc-devel
mailing list