C99 では void ポインターを解放できますが、C++98 では void ポインターを削除できません。さらに、なぜ動作が未定義として分類されるのですか? new の実装によっては、情報がポインターと共に格納されるため、デアロケーターはそのブロックを解放するのに十分な情報を持っている必要があります。C++ 標準から:
これは、void * 型のオブジェクトが存在しないため、void * 型のポインターを使用してオブジェクトを削除できないことを意味します。
唯一の重要な違いは、void ポインターを削除するとデストラクタが実行されないことです。その結果、メモリ リークが発生する可能性があります。しかし、確かに、これは未定義の動作を保証するものではなく、むしろ「PAY ATTENTION」の兆候であるべきです。シナリオに似ていませんか: ポリモーフィックな破壊のための (純粋な) 仮想デストラクタ。つまり、どちらのシナリオでも、適切に割り当てを解除するには、実装固有の知識が必要です。