Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Destructor abbrechen (https://www.delphipraxis.net/209899-destructor-abbrechen.html)

archimedix 6. Feb 2022 09:31

Delphi-Version: 10.4 Sydney

Destructor abbrechen
 
Hallo, weiß jemand, ob bzw. wie man einen Destruktor "abbrechen" kann?
Soll heißen, den Destruktor verlassen, ohne dass der eigentliche Destruktor-Code zum Freigegeben des Objekts ausgeführt wird.

Der Programmfluss sollte nach dem Aufruf regulär weiterlaufen, also kein Abort o.ä.

Redeemer 6. Feb 2022 10:38

AW: Destructor abbrechen
 
Ich würde mal vermuten, dass das nicht geht, um einen davor zu schützen, hier einen schweren konzeptionellen Fehler zu machen. Wenn man etwas freigeben möchte, möchte man etwas freigeben.

Erstell eine Methode CanDestroy oder so (ähnlich wie TForm.CanClose) und rufe die auf.

himitsu 6. Feb 2022 11:27

AW: Destructor abbrechen
 
Natürlich geht es nicht mehr im Destroy, bzw. ich kenne eh keinen Grund, warum man das machen will.

Wenn du schon mitten im Freigeben bist, dann kann bereits etwas teilweise freigegeben sein (weißt du ja nicht, wie die Vererbung vor/nach dir aussieht) und somit wäre die Instanz eh nicht mehr voll funktionsfähig.



Aber Delphi-Referenz durchsuchenBeforeDestruction



"Regulär" mit Exceptions an einer unnötigen Stelle?

jaenicke 6. Feb 2022 15:43

AW: Destructor abbrechen
 
Ich hielte es für sinnvoller, wenn du etwas zum Hintergrund schreibst. Ich bin mir sicher, dass es in jedem Fall eine bessere Lösung gibt, selbst wenn es so ginge wie du dir das vorstellst.

Vorsichtig werfe ich einmal Interfaces in den Raum. Ein referenzgezähltes Objekt kannst du über Interfaces realisieren, so dass es automatisch freigegeben wird, wenn niemand mehr eine Referenz darauf hat. Du kannst also z.B. die Interface-Referenz weiterliefern und in dann "vergessen", freigegeben wird sie aber erst, wenn sie der "Empfänger" nicht mehr nutzt.

generic 7. Feb 2022 16:49

AW: Destructor abbrechen
 
@archimedix beschreibe doch mal bitte den gesamten Geschäftsablauf. Ich glaube du verzettelst dich da, wenn den den Freigabe-Prozess abbrechen willst.
Diese sollte am besten gar nicht erst eingeleitet werden.

Vor allem, wie stellst du dir den Abbruch vor? Soll eine Exception ausgelöst werden oder soll das Object einfach nur "bleiben".

Stevie 7. Feb 2022 17:32

AW: Destructor abbrechen
 
Zitat:

Zitat von archimedix (Beitrag 1501757)
Hallo, weiß jemand, ob bzw. wie man einen Destruktor "abbrechen" kann?
Soll heißen, den Destruktor verlassen, ohne dass der eigentliche Destruktor-Code zum Freigegeben des Objekts ausgeführt wird.

Kurze Antwort: nein, die lange möchtest du nicht wissen :mrgreen:

KodeZwerg 7. Feb 2022 18:00

AW: Destructor abbrechen
 
Zitat:

Zitat von archimedix (Beitrag 1501757)
Hallo, weiß jemand, ob bzw. wie man einen Destruktor "abbrechen" kann?

Man ruft nicht
Delphi-Quellcode:
.Free
oder ähnliches auf.

stahli 7. Feb 2022 18:26

AW: Destructor abbrechen
 
Vielleicht noch ein Erklärungsversuch:

Der Destructor gibt nicht das Objekt bzw. den Speicherplatz frei, sondern ruft nur eine eingeschobene Aufräummöglichkeit an, um Abhängigkeiten u.ä. zu bereinigen. Wenn man das abbricht verzichtet man nur auf das Bereinigen von Abhängigkeiten.

archimedix 7. Feb 2022 18:50

AW: Destructor abbrechen
 
Alles klar, danke für die zahlreichen Antworten!
Normalerweise ist es Unsinn, einen Destruktor abbrechen zu wollen, stimme ich voll zu.

Ich brauchs für eine Art Hack, an dem ich bastel, wo ich Non-Delphi-Klassen (aus DLL, zugänglich über C-sytle API) als Delphi-Klassen, verwenden möchte und jetzt versuche, das einigermaßen safe zu machen.

Stevie 9. Feb 2022 06:53

AW: Destructor abbrechen
 
Zitat:

Zitat von archimedix (Beitrag 1501841)
Ich brauchs für eine Art Hack, an dem ich bastel, wo ich Non-Delphi-Klassen (aus DLL, zugänglich über C-sytle API) als Delphi-Klassen, verwenden möchte und jetzt versuche, das einigermaßen safe zu machen.

Du hast also vermutlich eine spezielle Klasse in Delphi, von der du ableitest und nutzt diese dann als Wrapper für die Objekte aus der DLL?
Eventuell kannst du FreeInstance überschreiben - das ist die Methode, die letztlich den Speicher frei gibt. (siehe System.pas TObject.FreeInstance).
Ohne genau zu wissen, wie dein Hack funktioniert kann ich aber nicht sagen ob das so ohne weiteres was taugt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:56 Uhr.
Seite 1 von 2  1 2      

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