Heim >Backend-Entwicklung >C++ >Ist es sicher, über „void*' zugewiesenen Speicher in C zu löschen?

Ist es sicher, über „void*' zugewiesenen Speicher in C zu löschen?

DDD
DDDOriginal
2024-12-06 13:55:111047Durchsuche

Is it Safe to Delete Memory Allocated via `void*` in C  ?

Gefahren des Löschens über Void-Zeiger in C

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*?

Undefiniertes Verhalten

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

Konsequenzen

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 wird

Das 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn