Bedenken Sie den folgenden Codeausschnitt:
void* my_alloc(size_t size) { return new char[size]; } void my_free(void* ptr) { delete[] ptr; }
Es stellt sich die Frage: Ist die Verwendung sicher? my_free, um einen von my_alloc zugewiesenen Zeiger zu löschen, vorausgesetzt, my_alloc gibt a zurück void*?
Die Antwort ist ein klares „Nein“. Das Löschen über ein void* ist im C-Standard ausdrücklich verboten. 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.
Und die Fußnote fügt hinzu:
Dies impliziert, dass ein Objekt kann nicht mit einem Zeiger vom Typ void* gelöscht werden, da keine Objekte vom Typ void vorhanden sind
Löschen durch Eine Lücke* kann zu unvorhersehbaren und katastrophalen Folgen führen. Das Programm kann aufgrund eines Speicherfehlers abstürzen, Daten beschädigen oder fehlerhafte Ergebnisse liefern.
Daher ist es unbedingt erforderlich, den Zeiger immer auf den richtigen Typ umzuwandeln, bevor Sie ihn löschen. In diesem Fall sollte der Zeiger in char* umgewandelt werden, bevor er an delete[].
übergeben wirdDas obige ist der detaillierte Inhalt vonIst es sicher, über „void*' zugewiesenen Speicher in C zu löschen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!