AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Referenzen auf ungültige Objekte

Ein Thema von stahli · begonnen am 14. Mär 2011 · letzter Beitrag vom 2. Mär 2012
 
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.337 Beiträge
 
Delphi 11 Alexandria
 
#1

Referenzen auf ungültige Objekte

  Alt 14. Mär 2011, 13:31
(Ich habe es schon mal angesprochen, will es aber nochmal strukturierter angehen.)

Das Problem:
- Objekt O ist instantiiert.
- Eigenschaft X.MyO zeigt auf O.
- Variable MyO zeigt ebenfalls auf O.

Wird Objekt O freigegeben (vielleicht sogar mit FreeAndNil(O)) zeigen X.MyO und MyO auf einen "ungültigen" Speicherbereich.

Eine Lösung sollen Interfaces bzw. Referenzzähler bieten. Durch diese wird O tatsächlich erst freigegeben, wenn die Referenzen von X.MyO und MyO quasi abgemeldet werden.
Wie ich das verstanden habe, funktioniert dies so mit Interfaces im Delphi sowie auch mit der GarbageCollection im .NET.
Das läuft auch unter dem Begriff "SmartPointer".

Soweit richtig?

Das ist aber noch nicht der Ansatz, den ich mir wünschen würde.
Ich hätte gern, dass X.MyO und MyO bei O.Free automatisch auf nil gesetzt werden.

Derzeit löse ich das in meinem Projekt händisch (durch die Verwaltung von eigenen Listen), da kann es jedoch passieren, dass ich einige Objekte vergesse und später nachtragen muss.

Daher zwei Fragen:

1) Könnte/Sollte Delphi (optional) nicht eine Funktion bieten, die eine solche Verwaltung übernimmt?
Man könnte Objekte regestrieren, die "überwacht" werden sollen: RegisterValidObject(O) Das Objekt O wird in eine Liste aufgenommen. Wird das Objekt freigegeben, wird es aus der Liste entfernt.
Dann könnte man mit IsValidObject(X.MyO) bzw. IsValidObject(MyO) prüfen, ob das Objekt noch gültig (noch in der Kontroll-Liste enthalten) ist.
Das wäre so ähnlich zu sehen, wie Assigned(X.MyO) , wobei nicht nur auf nil geprüft wird, sondern auf die Existenz des referenzierten Objektes.

2) Weiterhin wäre es wünschenswert, wenn die Referenzen automatisch "genilt" würden.
Dazu müsste wohl zusätzlich verwaltet werden, ob eine Variable, ein Objektfeld oder eine Objekteigenschaft das zu überwachende Objekt referenziert.
Bei der Freigabe von O müssten alle diese registrierenten Referenzen automatisch auf nil gesetzt werden.


Im Moment realisiere ich den zweiten Weg selbst durch Nutzung der neuen RTTI-Möglichkeiten.
Ich durchsuche meine Objekte nach überschreibbaren Eigenschaften, die auf Objekte zeigen, prüfe, ob das betreffende Objekt noich existiert und setze andernfalls diese Eigenschaft auf nil.
Das funktioniert, ist aber auf meine eigenen Objekte beschränkt und berücksichtigt keine Variablenreferenzen.

Eine Delphi-native Lösung hielte ich für nützlich und grundsätzlich wohl auch für realisierbar.
Wie seht Ihr das?
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz