delete auf void-Pointer anwenden
-
Hi
Geht folgendes:
struct A { int b; }; A* a = new A; void* pointer = (void*) a; delete pointer;
Also wird a ordnungsgemäß gelöscht? Oder weiß delete nicht, wieviel es freigeben soll? Mein Compiler meckert nicht, aber man weiß ja nie.
Aber erzählt mir bitte nicht, dass das schlechte Praxis ist, das weiß ich, aber ich komme nicht drumrum. Deshalb möchte ich nur wissen, ob es rein technisch funktioniert oder nicht.
Tschö,
Jan.
-
So wie ich den Standard lese, ist das erlaubt. Allerdings darf die Klasse keinen nicht-trivialen Destruktor haben. Mit Arrays (delete[]) funktioniert es auch nicht.
-
@Bashar
Kannst du das mal erklären? So wie ich 5.3.5 verstehe ist hat der Code eindeutig UB. void hat keinen virtuellen Destruktor also muss der static type des Operanden gleich dem dynamischen Typ sein. Dem ist hier aber nicht so -> UB. Eine Suche in comp.lang.c++.* liefert ähnliche Ansichten.Z.B. hier
-
Oh. Anscheinend hab ich beim querlesen die falschen Nebensätze miteinander verbunden.
-
char*a=new char; operator delete(a); char*b=new char[45]; operator delete[](b); A*c=new A; c->~A(); operator delete(a);
Müsste doch aber legal sein, oder sehe ich das falsch?
-
Ja, müsste.
-
Irgendwer schrieb:
A*c=new A;
c->~A();
operator delete(a);
Müsste doch aber legal sein, oder sehe ich das falsch?Nur doof, wenn A einen klassenspezifischen operator new hat.
-
Bashar schrieb:
Oh. Anscheinend hab ich beim querlesen die falschen Nebensätze miteinander verbunden.
Die Ausrede muss ich mir merken.