E2157 Für das Löschen eines Objekts ist genau eine Umwandlung in einen Zeigeroperator erforderlich (C++)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Compiler-Fehler und -Warnungen (C++) - Index

Wenn der Operator delete für ein Objekt (beachten Sie: nicht für einen Zeiger auf ein Objekt, sondern für das Objekt selbst) verwendet wird, ist es standardmäßig erforderlich, dass das Objekt genau eine "Umwandlung in einen Zeigeroperator" definiert, die den freizugebenden Zeiger ergibt.

Beispiel 1:

class T2DTranslation {
	// ...
};

int _tmain(int argc, _TCHAR* argv[]) {
	T2DTranslation t;
	delete t; // E2157

	return 0;
}

Beispiel 2:

#include <stdio.h>

class T2DTranslation {
private:
	int *coord;

public:
	T2DTranslation() {
		coord = new int[3];
	}

	operator int *() {
		puts("Conversion...");
		return coord;
	}
};

int _tmain(int argc, _TCHAR* argv[]) {
	T2DTranslation t;

	delete t;

	return 0;
}

Da 't' im zweiten Beispiel kein Zeiger ist, sondern ein Objekt, löscht der Compiler 'coord', weil dies das Ergebnis des Zeigerumwandlungsoperators für das Objekt ist. Mehrere Umwandlungen in Zeigeroperatoren sind unzulässig, da der Compiler nicht feststellen kann, welche aufgerufen werden soll.

Diese Botschaft kann auch angezeigt werden, wenn delete[] aufgerufen wurde, ohne dass er erforderlich ist (beispielsweise würden Sie den Operator delete beim Arbeiten mit Zeigern auf dynamischen Speicher und nicht auf einen Vektor des Typs int aufrufen).