Bedenken Sie den folgenden Codeausschnitt:
void* my_alloc(size_t size) { return new char[size]; } void my_free(void* ptr) { delete[] ptr; }
Ist es sicher, einen als zugewiesenen Zeiger zu löschen? void* mit delete[] Operator?
Antwort:
Das Löschen eines Zeigers über ein void* ist im C-Standard ausdrücklich nicht definiert. In Abschnitt 5.3.5/3 heißt es:
Wenn sich in der ersten Alternative (Objekt löschen) der statische Typ des Operanden von seinem dynamischen Typ unterscheidet, muss der statische Typ eine Basisklasse des dynamischen Typs des Operanden sein und der statische Typ muss einen virtuellen Destruktor haben, sonst ist das Verhalten undefiniert. Bei der zweiten Alternative (Array löschen) ist das Verhalten undefiniert, wenn der dynamische Typ des zu löschenden Objekts von seinem statischen Typ abweicht.
Zusätzlich wird in der Fußnote darauf hingewiesen:
Dies impliziert dass ein Objekt nicht mit einem Zeiger vom Typ void* gelöscht werden kann, da keine Objekte vom Typ vorhanden sind void.
Schlussfolgerung:
Es ist unsicher, einen als void* zugewiesenen Zeiger mit dem Operator delete[] zu löschen. Wandeln Sie den Zeiger vor dem Löschen immer in seinen ursprünglichen Typ um.
Das obige ist der detaillierte Inhalt vonIst das Löschen eines „void*'-Zeigers mit „delete[]' in C sicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!