ホームページ >バックエンド開発 >C++ >C で `delete[]` を使用して `void*` ポインタを削除するのは安全ですか?

C で `delete[]` を使用して `void*` ポインタを削除するのは安全ですか?

DDD
DDDオリジナル
2024-12-05 15:00:18930ブラウズ

Is Deleting a `void*` Pointer with `delete[]` Safe in C  ?

ボイド ポインタの削除: 安全性評価

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

void* my_alloc(size_t size) {
  return new char[size];
}

void my_free(void* ptr) {
  delete[] ptr;
}

として割り当てられたポインタを削除しても安全ですか? delete[] を使用した void*演算子?

答え:

void* によるポインターの削除は、C 標準では明示的に定義されていません。セクション 5.3.5/3 では次のように述べられています:

最初の選択肢 (オブジェクトの削除) では、オペランドの静的型がその動的型と異なる場合、静的型はオペランドの動的型の基底クラスでなければなりません。静的型には仮想デストラクターが必要です。そうでない場合、動作は未定義です。 2 番目の選択肢 (配列の削除) では、削除されるオブジェクトの動的タイプがその静的タイプと異なる場合、動作は未定義です。

さらに、脚注には次のように注記されています。

これは意味します。 void* 型のオブジェクトがないため、型 void* のポインタを使用してオブジェクトを削除できないことvoid.

結論:

delete[] 演算子を使用して void* として割り当てられたポインターを削除するのは安全ではありません。削除する前に、必ずポインタを元の型にキャストしてください。

以上がC で `delete[]` を使用して `void*` ポインタを削除するのは安全ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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