On 19 Jun 2008, at 14:36, Michael Van Canneyt wrote:

On Thu, 19 Jun 2008, Boian Mitov wrote:

Here is a code sniped that sows just one example of the problem:

This is a very simple example of how important the order really is:
We have even more crucial problems related with this. This is just a simple
one:

destructor  TALBasicAudioOut.Destroy();
var
WriteLock : IOWLockSection;

begin
WriteLock := FLock.StopLock();

FInputPin.Free();
FEnablePin.Free();
FMasterPumping.Free();
WriteLock := NIL;
FLock.Free();
inherited;
end;

You can see that the WriteLock MUST be released before the FLock.Free();,

Maybe Jonas or Florian can comment on this.

Reference counting only guarantees that
a) an instance will not be freed as long as any references to it exist
b) an instance will be freed automatically after the last reference disappears

It does not guarantee/define
a) at which point in the code exactly an instance will be freed
b) the actual mechanism used for reclaiming the memory (a simple free when the reference count hits zero, mark and sweep, ...)

It is therefore not a substitute for managing other kinds of resources which require predictable freeing points. The above example is conceptually identical to several of the examples given in the comments to http://bugs.freepascal.org/view.php?id=9472

It's similar to how you cannot use the Finalize method in Java to perform resource management, because it will only be called when the garbage collector reaps your instance and not necessarily immediately when the last reference to an instance is gone.


Jonas
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to