PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Frage zu delete und Destruktor


Aqualon
2006-01-01, 16:51:45
Hallo!

Ich hab eine Frage zum delete in C++. Wenn ich den Befehl auf ein Objekt anwende, wird ja u.a. dessen Destruktor aufgerufen und ausgeführt.

Kann der Destruktor die weitere Bearbeitung der Methode, die ihn ausgelöst hat blockieren, oder geht das nach einem delete einfach weiter und der Destruktor wird quasi parallel abgearbeitet?

Aqua

Trap
2006-01-01, 17:04:11
Das ist synchron, delete blockiert bis der Destruktor fertig abgearbeitet ist.

Coda
2006-01-01, 17:18:42
Dazu bräuchte man ja Threads, wie kommst du auf so eine Idee?

Trap
2006-01-01, 17:43:00
In C# laufen die Destruktoren pseudo-parallel zum normalen Code (was ich für äußerst hässlich halte).

Es wäre recht einfach dieses Verhalten nach C++ zu portieren, einfach eine Liste von noch abzuarbeitenden Destruktoren anlegen und bei delete jeweils den Destruktor hinzufügen und wenn x Elemente in der Liste sind alle abarbeiten.

Coda
2006-01-01, 17:55:54
Die ist nicht parallel sondern nur verzögert. Das ist etwas ganz anderes.
Finalisierung bei GC-Sprachen kommt eh direkt aus der Hölle.

Aber bist du sicher, dass du nicht Java meinst? Ich dachte C# würde das besser machen.

Edit: Nein, es ist sogar noch schlimmer X-D

grakaman
2006-01-01, 18:02:00
In C# laufen die Destruktoren pseudo-parallel zum normalen Code (was ich für äußerst hässlich halte).


Das sind ja auch eigentlich Finalizer. Bei C# liest man nur mal ab und zu von Desktruktoren, weil dort eben die selbe Syntax verwendet wird (bei C++.NET auch), es gibt sie aber so nicht in .NET. Dann muss man bei .NET eben explizit eine Dispose Methode implementieren/aufrufen. Das schadet ja auch niemanden.

Trap
2006-01-01, 19:06:41
Die ist nicht parallel sondern nur verzögert. Das ist etwas ganz anderes.
Ich hab das pseudo hinzugefügt weil es nicht wirklich parallel ist. Hat aber 90% der Auswirkungen von echt parallelem Code. Es ist nicht nur verzögert, sondern umbestimmt verzögert, also dürfen beim Abarbeiten des Finalizers insbesondere alle Klasseninvarianten verletzt sein, Operationen nicht vollständig abgearbeitet, nichtrekursive Funktionen 2 mal parallel aufgerufen werden und so weiter...

grakaman
2006-01-01, 21:25:02
[QUOTE=Trapalso dürfen beim Abarbeiten des Finalizers insbesondere alle Klasseninvarianten verletzt sein, Operationen nicht vollständig abgearbeitet, nichtrekursive Funktionen 2 mal parallel aufgerufen werden und so weiter...[/QUOTE]

Kannst du das mal genauer erläutern? :|

Trap
2006-01-01, 22:34:56
http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=88e62cdf-5919-4ac7-bc33-20c06ae539ae erklärt es in allen grauenhaften, alptraumwürdigen Details.