Einzelnen Beitrag anzeigen

r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#3

AW: Referenzen auf ungültige Objekte

  Alt 14. Mär 2011, 19:05
Wird Objekt O freigegeben (vielleicht sogar mit FreeAndNil(O)) zeigen X.MyO und MyO auf einen "ungültigen" Speicherbereich.
richtig.

Zitat:
Eine Lösung sollen Interfaces bzw. Referenzzähler bieten.
Ja, kann man dafür nehmen.

Zitat:
Durch diese wird O tatsächlich erst freigegeben, wenn die Referenzen von X.MyO und MyO quasi abgemeldet werden.
So in etwa. Ja.

Zitat:
Wie ich das verstanden habe, funktioniert dies so mit Interfaces im Delphi sowie auch mit der GarbageCollection im .NET.
Is AFAIK anders realisiert, aber so kannst du dirs vorstellen.

Zitat:
Das läuft auch unter dem Begriff "SmartPointer".
Den Begriff "smart pointer" kenn ich eher aus C++. Da beschreibt er ein Konzept mit ähnlichem Zweck. Interfaces würde ich aber erstmal nicht als smart pointer bezeichnen, auch wenn der Effekt ähnlich ist.

Zitat:
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.
Prinzipiell möglich. Das ist aber doch genau das, was du momentan tust. Oder hab ich dich da falsch verstanden?

Zitat:
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.
Und das ist ohne erheblichen Aufwand eben nicht möglich. Können die neuen records eigentlich auch Destruktoren haben? Wenn ja, könnte man sich damit mehr oder weniger die oben erwähnten Smart Pointer nachbauen. Das wäre dann zumindest sowas Ähnliches.

Zitat:
Eine Delphi-native Lösung hielte ich für nützlich und grundsätzlich wohl auch für realisierbar.
Wie seht Ihr das?
Jetzt kommt meine eigentlich Antwort auf deine Frage: Ich halte das für in den meisten Fällen unnötig. Wenn du einen sauberen Ansatz hast, brauchst du das alles nicht. Insbesondere halte ich deine Workarounds für Frickellösungen, die mehr Probleme schaffen als lösen. Ich will dein Vorhaben damit nicht generell verteufeln. Manchmal braucht man eben - leider - Frickllösungen. Ich denke aber, du solltest dir nochmal genau überlegen, ob du nicht ein konzeptionelles Problem hast. Sag mal was zu deinen Objekten. Welche sind es, warum brauchst du die und warum kommt es zu diesen Problemen mit dem Freigeben (also nicht technisch, sondern inhaltlich gesehen)? Vielleicht gibts ja eignen besseren Weg...

mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat