0

C99 では void ポインターを解放できますが、C++98 では void ポインターを削除できません。さらに、なぜ動作が未定義として分類されるのですか? new の実装によっては、情報がポインターと共に格納されるため、デアロケーターはそのブロックを解放するのに十分な情報を持っている必要があります。C++ 標準から:

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

唯一の重要な違いは、void ポインターを削除するとデストラクタが実行されないことです。その結果、メモリ リークが発生する可能性があります。しかし、確かに、これは未定義の動作を保証するものではなく、むしろ「PAY ATTENTION」の兆候であるべきです。シナリオに似ていませんか: ポリモーフィックな破壊のための (純粋な) 仮想デストラクタ。つまり、どちらのシナリオでも、適切に割り当てを解除するには、実装固有の知識が必要です。

4

1 に答える 1

4

「新しい実装に応じて」 - あなたの問題があります。メモリ ブロックには何らかの属性が関連付けられていると想定していますが、C++ では必ずしもそうである必要はありません。ポインターの型には、追加情報なしで解放するのに十分な情報 (つまり、クラス/構造体のサイズ) があります。また、あなたが言ったように、デストラクタを呼び出す必要があります。

于 2013-11-11T23:16:08.863 に答える