Void ポインターとオブジェクトの削除
C では、void ポインターを使用して、任意の型のオブジェクトのアドレスを格納できます。一般的な疑問が生じます: void ポインターを使用してオブジェクトを安全に削除できますか?
問題:
次のコードを考えてみましょう:
void* my_alloc(size_t size) { return new char[size]; } void my_free(void* ptr) { delete [] ptr; }
ここで、my_alloc は char 配列を割り当て、void ポインタを返します。 my_free は、void ポインタが指すオブジェクトを削除しようとします。
答え:
キャストせずに void ポインタを介してオブジェクトを削除することは、C 言語によると未定義の動作です。標準 (5.3.5/3)。これは、動作がコンパイラやプラットフォームによって異なる可能性があることを意味します。
この未定義の動作の理由は、コンパイラが削除されるオブジェクトの実際のタイプを判断できないためです。その結果、正しいデストラクターが呼び出されることを保証することができず、メモリ破損やその他の予期しない動作が発生する可能性があります。
安全なアプローチ:
安全に削除するにはvoid ポインターを介してオブジェクトをオブジェクトに割り当てる場合は、オブジェクトを割り当てた元のポインター型にキャストする必要があります。これにより、正しいデストラクターが呼び出され、オブジェクトに関連付けられたリソースが適切にクリーンアップされることが保証されます。
たとえば、上記のコードでは、削除は次のように行う必要があります。
char* ptr = (char*)my_alloc(size); delete [] ptr;
以上がC で Void ポインターを使用してオブジェクトを安全に削除できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。