次のコード スニペットを考えてみましょう:
void* my_alloc(size_t size) { return new char[size]; } void my_free(void* ptr) { delete[] ptr; }
使用しても安全なのかという疑問が生じます。 my_free は、my_alloc によって割り当てられたポインタを削除します。ただし、my_alloc はvoid*?
答えは、きっぱり「ノー」です。 void* による削除は、C 標準によって明示的に禁止されています。セクション 5.3.5/3 では次のように述べられています:
最初の選択肢 (オブジェクトの削除) では、オペランドの静的型がその動的型と異なる場合、静的型はオペランドの動的型の基底クラスでなければなりません。静的型には仮想デストラクターが必要です。そうでない場合、動作は未定義です。 2 番目の選択肢 (配列の削除) では、削除されるオブジェクトの動的タイプがその静的タイプと異なる場合、動作は未定義です。
その脚注には次のように追加されています。
これは、 void* 型のオブジェクトがないため、型 void* のポインタを使用してオブジェクトを削除することはできません。 void
void* を介して削除すると、予測不可能で壊滅的な結果につながる可能性があります。プログラムはメモリ エラーでクラッシュしたり、データが破損したり、誤った結果が生成されたりする可能性があります。
そのため、ポインタを削除する前に、常に正しい型にポインタをキャストすることが不可欠です。この場合、ポインタは delete[].
に渡す前に char* にキャストする必要があります。以上がC の `void*` によって割り当てられたメモリを削除しても安全ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。