Die Speicherstelle der Variable wirst du aber nicht ermitteln können.
Dass Embacadero da irgendwas in die Richtung einbaut halte ich auch für recht unwahrscheinlich. Der automatische Aufruf von _AddRef
und _Release
ist sowieso schon ein "Hack".
Dass ich das nicht ermitteln kann dachte ich mir. Aber der Compiler weiß ja eigentlich, wohin er die Referenz schreibt (also wo der Speicherplatz der Variablen liegt). Das würde ich jedenfalls voraussetzen. Daher dachte ich, dass Emba einen entsprechenden Log erzeugen könnte.
Aber so genau kann ich das natürlich nicht wissen.
Also falls du die Schnittstellen nur in deinem Delphi Programm verwendest und nicht z.b. aus einer C++
DLL heraus damit hantieren willst, dann könntest du die Interfaces auch durch abstrakte Klassen ersetzen.
Mit Interfaces will ich auf jeden Fall arbeiten und i.d.R. auch die Referenzzählung nutzen. Für die Sonderfälle der gegenseitigen Referenzierungen muss man dann halt eine explizite Lösung finden.
@Stevie
Du hast Recht.
Ich habe mein ICleanUp nochmal etwas umgebaut. Es sollte jetzt eher dem entsprechen, was Du mit IDisposable gemeint hast.
Ich rufe jetzt einfach Kill(MyIntf) auf (analog FreeAndNil(MyObj)).
Die Funktion CleanUpRef habe ich mal noch drin gelassen, aber sie ist i.d.R. nicht erforderlich.
Die häufigen gegenseitigen Referenzen waren Singleton-InterfaceObjekte, die sich alle gegenseitig benötigen und die ich den anderen Objekten jeweils gegenseitig bekanntgegeben hatte (entweder im constructor oder durch spätere Registrierung.
Jetzt habe ich diese doch wieder global bereitgestellt, was die Referenzierungsorgie natürlich verringert.