Stellen Sie sich den folgenden Codeausschnitt vor:
void* my_alloc(size_t size) { return new char[size]; } void my_free(void* ptr) { delete[] ptr; }
Ist es sicher, den Void-Zeiger ptr zu löschen? dabei Art und Weise?
Antwort:
Gemäß dem C-Standard ist dies eine heimtückische Praxis. Abschnitt 5.3.5/3 lautet wie folgt:
"Wenn sich in der ersten Alternative (Objekt löschen) der statische Typ des Operanden von seinem dynamischen Typ unterscheidet, soll der statische Typ eine Basisklasse des sein Der dynamische Typ des Operanden und der statische Typ müssen einen virtuellen Destruktor haben, oder das Verhalten ist undefiniert. Bei der zweiten Alternative (Array löschen) ist das Verhalten anders, wenn der dynamische Typ des zu löschenden Objekts von seinem statischen Typ abweicht undefiniert.“
Die dieser Passage folgende Fußnote betont weiter:
„Dies impliziert, dass ein Objekt nicht mit einem Zeiger vom Typ void* gelöscht werden kann, da es keine Objekte vom Typ void gibt.“
Daher ist das Löschen über einen Void-Zeiger strengstens verboten, da es zu unvorhersehbarem Verhalten führen kann.
Das obige ist der detaillierte Inhalt vonIst das Löschen eines Void-Zeigers in C sicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!