So löschen void-pointer?
Gibt es etwas falsch beim löschen eines Objekts, wie dies in C++?
MyCls* c = new MyCls();
void* p = (void*)c;
delete (MyCls*)p;
- Ich glaube das nicht.
- Casting einen Zeiger auf
void *
und dann zurück zu seiner ursprünglichen Art ist garantiert zu erhalten seinen Wert. - §5.2.9/13 "Ein Wert vom Typ Zeiger auf Objekt umgewandelt zu "Zeiger auf cv void" und zurück, möglicherweise mit unterschiedlichen cv-Qualifikation, hat seinen ursprünglichen Wert."
- Warum würden Sie wollen, dies zu tun?
- Aidley, weil ich wollte, verwenden Sie eine C++ - Klasse in C, so war es notwendig, void-Zeiger.
- Ich denke, Sie sollten wahrscheinlich nach eine detailliertere Frage, die umreißt, was Sie tun und warum, weil ich stark vermute, dass du tust es in einer weniger als wünschenswert, wenn das der Fall ist.
- Aber nicht sagen, was der resultierende Wert ist. Es sagt also ausdrücklich, die für andere Umbauten, wie "Ein rvalue vom Typ float umgewandelt werden können, um ein rvalue vom Typ double. Der Wert ist unverändert"
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese, wie geschrieben wird, ist legal.
Den cast zurück
MyCls*
ist kritisch. Ohne, dass, Sie ruft Undefiniertes Verhalten--die MyCls Destruktor wird nicht aufgerufen werden, und andere Probleme auftreten (z.B. Absturz). Sie werfen wieder den richtigen Typ.Beachten Sie auch, dass dies kann kompliziert werden, wenn mehrfache Vererbung beteiligt ist und mehrere Abgüsse verwendet werden. Deine casts muss "passen" in jede Richtung.
Wenn Ihr code ist so strukturiert, dass Sie nicht wissen, die Art zu der Zeit der Zerstörung, geben Sie jedem löschbar Objekt einer gemeinsamen Basis-Klasse mit einem virtuellen Destruktor. Dann warf Sie zurück zu der Basis-Klasse vor dem löschen aufgerufen wird.
Dem code ist gut definiert. Beide Modelle sind statische Modelle, obwohl es ist guter Stil machen diese explizite (
static_cast<void*>
, etc.) anstelle der Verwendung von C-Stil-casts. Der standard sagt, dass, wenn Sie einen Zeiger auf Objekt umgewandelt wird, einen void-Zeiger und zurück durch statische wirft, wird es seinen ursprünglichen Wert. Also, Ihre Letztedelete
Ausdruck hat die gleiche Wirkung wiedelete c
.Dass gesagt wird, die Verwendung von
void*
ist oft ein code smell in C++.void*
. Ich habe so viele Krieg-Geschichten von der Reinigung bis nach dem ehemaligen Java-Programmierer erwarten, dassdelete someVoidPointer;
Nur Arbeit...Obwohl dieser code ist gültig, es ist keine gute Praxis.
Als Allgemeine Richtlinie sollte es nicht sein
new
s unddelete
s in der wildnis. Versuchen Sie durchzusetzen, die Regel, dass nur Konstruktoren aufrufen könnennew
und nur Destruktoren aufrufen könnendelete
wird Ihnen helfen, organisieren Sie Ihren code besser.Wenn Sie mit C++11, immer versuchen
std::shared_ptr
und dergleichen, dies zu tun, die oben automatisch für Sie.