On 01/27/2017 06:36 AM, Dmitry Boyarintsev wrote:
On Tue, Jan 10, 2017 at 6:14 AM, Michael Schnell <mschn...@lumino.de
<mailto:mschn...@lumino.de>> wrote:
If destroying an object is not necessary, the class should provide a
dummy Free procedure. So the application programmer always can/should
use Free.
Why dummy? if it should be like this
procedure TObject.Free;
begin
if Self<>nil then Self:=nil;
end;
Destroying object is not necessary, but dereferencing is.
If the code keeps the reference to an object, it would not be collected.
[...]
Correct me if I'm wrong: It would seem like that your free implementation
doesn't actually do anything, other than fulfilling the obligation of
having a "free". If I do this:
var
o: TObject;
begin
o:=TObject.create;
{ do something ... }
o.free;
end.
Wouldn't "o" still contain a reference after "free" is called? In non-JVM
FPC "self" is just another variable, who's origin is somewhat hidden by the
compiler. The call to "o.free" would do something like "TObject.free(o)"
where "o" is passed by *value* into the procedure variable "self". "Self"
comes and goes with the scope of the "TObject.free" procedure. Which is why
if I'm concerned about detecting whether or not "o" still contains a
correct object reference I would need to do something like this: "o.free;
o:=nil;" so I can test for "nil" later. Although I think FPC added a
procedure to do that some time back. Yup, I see it "SysUtils.FreeAndNil".
I'm not sure of the specific semantics of the JVM calls but from what I
read in the various FPC JVM related pages on the wiki it would seem to use
similar semantics.
- Jon
--
Jon Foster
JF Possibilities, Inc.
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal