1

次の形式で、単純なリンク リスト ベースのメモリ マネージャーを作成しています。

...Header|Block|Header|Block... 使用済みおよび空きリスト付き。

realloc() 関数がブロックのサイズを縮小するように要求された場合、末尾のバイトの一部を新しく作成されたブロックのヘッダーで上書きしても問題ありませんか? 私が読んだドキュメントは、これが「未定義の動作」であることを示唆していますが、アプリケーションはまだそこにあるデータに依存していますか?

4

2 に答える 2

3

ほとんどの場合、未定義の動作に関するコメントは次のようになりました。

このような仕様は、 realloc の実装で末尾のバイトにヘッダーを挿入できるようにするために正確に存在します。これが未定義の動作であるということは、アプリケーションが (概念的にはなくなった) バイトから読み取ろうとすると、ヘッダーが読み取られ、アプリケーションにはゴミとして表示されることを意味します。書き込みさえすると、ヘッダーが殺されます-したがって、アプリケーションはそれを行うべきではありません。

于 2009-09-02T04:52:04.020 に答える
1

もちろん。再割り当てされたため、アプリによって解放され、マネージャーに属しています。新しいポインターでそれを壊し始めるのは普通のことです。

于 2009-09-02T04:50:55.923 に答える