Was ist ein "imcomplete type"?
-
Hi.
Ich wollte mal boost::checked_delete verstehen.Dort steht in der Doku:
The C++ Standard allows, in 5.3.5/5, pointers to incomplete class types to be deleted with a delete-expression. When the class has a non-trivial destructor, or a class-specific operator delete, the behavior is undefined. Some compilers issue a warning when an incomplete type is deleted, but unfortunately, not all do, and programmers sometimes ignore or disable warnings.
Was ist aber ein "incomplete type"? Wie sieht sowas aus?
-
ich glaube damit ist ein Objekt gemeint, das von anderen geerbt hat, und bei der Zerstörung nur teilweise zerstört wurde weil der Destruktor der übergeordneten Klasse(n) nicht virtual sind und ein Teil dadurch hängen bleibt.
-
Nein, ein incomplete type ist entweder der Typ void oder ein Klassentyp einer Klasse, von der bisher nur eine Deklaration, aber keine Definition existiert.
class Foo; Foo * makefoo(); int main() { Foo* f = makefoo(); delete f; // !!! }
-
Ah danke. Hab mir schon gedacht das es sowas wie eine Forward Declaration ist.
Aber man kann Foo gar nicht instanziieren mit new?
Wie soll man dann überhaupt makefoo implementieren?
Und wie soll solche eine Forward Declaration (oder ist es keine?) überhaupt einen "non-trivial destructor, or a class-specific operator delete" kriegen?
-
makefoo ist in meinem Beispiel in einer anderen Übersetzungseinheit definiert, wo auch die Definition der Klasse Foo sichtbar ist.
-
Der Compiler weis von Foo überhaupt nichts, alles was er tun kann ist den Speicher freigeben ohne Destruktor Aufruf.
Als Alternative kannst du eine delfoo(Foo*) Funktion schreiben. Nun ist Foo eigentlich keine Klasse mehr sondern eher ein Handle.