Frage

Ist es wahr, dass das folgende undefinierte Verhalten ergibt:

void * something = NULL;
char * buffer = new char[10];

something = buffer;
buffer = NULL;

delete [] something; // undefined??

Muss ich zuerst wirken something zu char * ?

War es hilfreich?

Lösung

Ja, ausschließlich, wenn Sie verwenden delete[] der statische Typ des Zeigers, den Sie delete[] Muss mit dem Typ des Arrays übereinstimmen, den Sie ursprünglich zugeteilt haben oder und definiertes Verhalten erhalten.

Normalerweise in vielen Implementierungen, delete[] rief ein void* Dies ist eigentlich eine Reihe eines Typs, der keine nicht trivialen Destruktor-Werke hat, aber nicht garantiert ist.

delete[] buffer

oder

delete[] (char*)something

wäre beide gültig.

Andere Tipps

Ja.

Aus dem Standard (5.3.5 löschen):

Der Wert des Löschvorgangs ist der Zeigerwert, der aus einem früheren Array-Neuausdruck entstanden ist.72) Wenn nicht, ist das Verhalten undefiniert. [Hinweis: Dies bedeutet, dass die Syntax der Delete-Expression mit dem Typ des von neuen Objekts zugewiesenen Objekts übereinstimmen muss, nicht mit der Syntax der neuen Expression.

In der ersten Alternative (Löschen von Objekt) muss der statische Typ der statischen Typ des Operanden sich von seinem dynamischen Typ unterscheiden . In der zweiten Alternative (Array löschen), wenn sich der dynamische Typ des zu gelöschten Objekts von seinem statischen Typ unterscheidet, ist das Verhalten undefiniert*.

** Dies impliziert, dass ein Objekt mit einem Zeiger vom Typ Typ void*nicht gelöscht werden kann*, da keine Objekte vom Typ Void vorhanden sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top