E2157 オブジェクトを削除するには、ポインタ変換演算子がちょうど 1 つ必要です(C++)

提供: RAD Studio
移動先: 案内検索

コンパイラのエラーと警告(C++):インデックス への移動

オブジェクト(オブジェクトへのポインタではなく、オブジェクトそのもの)に対して 'delete' 演算子を使用する場合は、標準規格上、オブジェクトには "ポインタ変換演算子" がちょうど 1 つ定義されている必要があり、その演算子により、解放されるポインタが生成されます。

例 1:

 class T2DTranslation {
 	// ...
 };
 
 int _tmain(int argc, _TCHAR* argv[]) {
 	T2DTranslation t;
 	delete t; // E2157
 
 	return 0;
 }

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

例 2 では、't' はポインタではなくオブジェクトなので、コンパイラは 'coord' を削除します。それがオブジェクトのポインタ変換演算子によって生成されるものだからです。ポインタ変換演算子が複数存在すると、どちらを呼び出すべきかコンパイラにはわからないので、無効です。

このメッセージは、delete[] が呼び出されたものの必要ない場合にも出力されることがあります(たとえば、動的メモリへのポインタを扱う場合は delete を呼び出すでしょうが、int 型のベクトルへのポインタを扱う場合にはそうではないでしょう)。