E2157 La suppression d'un objet nécessite exactement un opérateur de conversion en pointeur (C++)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Erreurs et avertissements du compilateur (C++) - Index

Si une personne utilise l'opérateur 'delete' sur un objet (pas un pointeur sur un objet, mais l'objet lui-même), le standard exige de définir exactement un "opérateur de conversion en pointeur" qui produira le pointeur libéré.

Exemple 1 :

class T2DTranslation {
	// ...
};

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

	return 0;
}

Exemple 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;
}

Dans le second exemple, comme 't' n'est pas un pointeur, mais un objet, le compilateur supprimera 'coord', car c'est ce que l'opérateur de conversion en pointeur de l'objet offre. Vous ne pouvez pas avoir plusieurs opérateurs de conversion en pointeur, car le compilateur ne saurait pas lequel appeler.

Ce message peut aussi apparaître si delete[] a été appelé sans être nécessaire (par exemple, vous pouvez appeler delete lorsque vous utilisez des pointeurs sur la mémoire dynamique, mais pas lorsque vous utilisez des pointeurs sur un vecteur de type int).