ホームページ >バックエンド開発 >C++ >C の `void*` によって割り当てられたメモリを削除しても安全ですか?

C の `void*` によって割り当てられたメモリを削除しても安全ですか?

DDD
DDDオリジナル
2024-12-06 13:55:111047ブラウズ

Is it Safe to Delete Memory Allocated via `void*` in C  ?

C での Void ポインターによる削除の危険性

次のコード スニペットを考えてみましょう:

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。