1. ホーム
  2. c++

[解決済み] voidポインタを削除しても大丈夫ですか?

2023-01-07 02:57:11

質問

以下のようなコードがあるとします。

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

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

これは安全ですか? それとも ptr にキャストされなければなりません。 char* にキャストして削除しますか?

どのように解決するのですか?

それは "safe." に依存します。アロケーション自体に関する情報がポインタと一緒に保存されるので、デアロケータはそれを正しい場所に戻すことができるので、通常は動作するでしょう。 この意味で、アロケータが内部境界タグを使用している限り、quot;safe" となります。(多くの場合そうです。)

しかし、他の回答で述べたように、voidポインタの削除はデストラクタを呼び出さないので、問題になる可能性があります。 その意味で、それは "safe." ではありません。

あなたがやっていることを、あなたがやっている方法で行う正当な理由はありません。 もし、独自の割り当て解除関数を書きたいのであれば、関数テンプレートを使って正しい型の関数を生成することができます。 それを行う良い理由は、特定の型に対して非常に効率的であるプールアロケータを生成することです。

他の回答で述べたように、これは 未定義の動作 になっています。一般的に、未定義の動作を避けることは良いことですが、このトピック自体は複雑で、矛盾する意見でいっぱいです。