![]() |
AW: Pointer existiert, das Objekt dahinter nicht. Wie zuverlässig prüfen?
Zitat:
Ich wollte damit nur sagen dass interfaces auch kein Allheilmittel sind. Aber ich verwende die auch gerne weil man normalerweise sich dann keine Gedanken mehr machen muss und wenn da ein Pointer noch eine Referenz drauf hält das Objekt gar nicht freigegeben wird. |
AW: Pointer existiert, das Objekt dahinter nicht. Wie zuverlässig prüfen?
Zitat:
Delphi-Quellcode:
In diesem Fall geht die Referenzzählung schief, da durch das const die Referenzzählung deaktiviert wird. Nach der Erstellung des Objekts wäre es aber gut, wenn der Referenzzähler einmal erhöht würde. Gibt man nämlich innerhalb der aufgerufenen Methode (Example) das Objekt weiter oder speichert die Referenz irgendwo, ist das Objekt dahinter ggf. plötzlich weg, denn der Zähler ist dann ggf. 0.
procedure Example(const AData: IBlub);
begin...end; Example(TMySuperObject.Create); Insofern gibt es schon Konstellationen, in denen Fehler in der Referenzzählung, die man beim Programmieren macht, nicht so einfach auffallen. Wenn man nicht schon einmal über den genannten Fall gestolpert ist, wird das vermutlich auch nicht so schnell auffallen beim Überlesen des Quelltextes. Zitat:
|
AW: Pointer existiert, das Objekt dahinter nicht. Wie zuverlässig prüfen?
Zitat:
Ich leite von einer (Ur) Klasse ab, bei der jedes Objekt eine eindeutige Identität in einem Feld und in einem anderen Feld den Zustand speichert. Der Constructor sorgt dafür das Identität und Zustand korrekt gesetzt werden, der Destrutor überschreibt den Zustand. Da der Offset der beiden Felder im Speicher bekannt ist, kann ich auch bei freigegebenen Objekten bei denen der Speicher nocht nicht überschrieben wurde prüfen ob diese noch existieren, und bei freigegebenen überschriebenen Objekten hingegen ist sehr unwahrscheinlich das beide Felder zufällig so überschrieben werden das diese Sinn ergeben. cu Ha Joe |
AW: Pointer existiert, das Objekt dahinter nicht. Wie zuverlässig prüfen?
Geht nur bei eignen Klassen, aber nicht z.B. bei der VCL. Aber immerhin.
Erwähnen möchte ich noch, dass madexcept hat die Möglichkeit hat, Speicherzugriffe abzusichern. Damit kann man u.U. Probleme in dem Bereich finden. Allerdings ist das extrem langsam und verbraucht viel Speicher. |
AW: Pointer existiert, das Objekt dahinter nicht. Wie zuverlässig prüfen?
Zitat:
ich muß zugeben, dass ich eigentlich noch ein Anfänger in Interfaces bin. Mich würde der Ansatz mit Interfaces sehr interessieren, wie man dann testen kann, ob das Objekt schon freigegeben wurde? Sprich, macht man dann einfach zu einem Objekt noch einen Wrapper Interface und testet man dann mit "if assigned(Interfacevariable) then", ob das Objekt bereits freigegeben wurde? :?: Könnte wer da ein kurzes Beispiel dazu posten? :-) lg, jus |
AW: Pointer existiert, das Objekt dahinter nicht. Wie zuverlässig prüfen?
Mit Interfaces brauchst du nicht mehr testen, denn die Instanz wird erst freigegeben, wenn du die Instanz vergessen hast.
Delphi-Quellcode:
Und wenn man nicht mehr weiß wonach man sucht, wie will man dann feststellen ob es noch existiert ...
var
foo, foo1, foo2: IFoo; begin foo := TFoo.Create; foo1 := foo; foo2 := foo; foo := nil; foo1 := nil; foo2 := nil; // Hier erfolgt jetzt automatisch die Freigabe der Instanz end; |
AW: Pointer existiert, das Objekt dahinter nicht. Wie zuverlässig prüfen?
Hallo,
Einspruch Zitat:
Die Freigabe erfolgt doch erst, wenn die Interface-Variable ihren Scope verläßt? In diesem Fall hinter dem abschließenden end? Oder wird das durch das nil-Setzen vorgezogen? |
AW: Pointer existiert, das Objekt dahinter nicht. Wie zuverlässig prüfen?
Zitat:
Übrigens muss es nicht mal nil sein. Auch das Zuweisen einer anderen Interface-Instanz an diese Variable würde den Referenzzähler der vorigen Instanz herunterzählen, so wie es den der neuen hochzählt. |
AW: Pointer existiert, das Objekt dahinter nicht. Wie zuverlässig prüfen?
Zitat:
Mach dir doch schnell mal ein kleines Konsolenprojekt mit einer Klasse die ein Interface implementiert und den Destructor überschreibt. Dort einen Breakpoint rein und schauen, wann der Debugger dort anhält. Somit kannst du das ganz leicht testen. |
AW: Pointer existiert, das Objekt dahinter nicht. Wie zuverlässig prüfen?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz