2009-09-02 2 views
1

単純なリンクリストベースのメモリマネージャを書いています:Reallocの実装

...ヘッダー|ブロック|ヘッダー|ブロック...使用済みおよびフリーリスト。

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

答えて

3

おそらく、未定義の振る舞いについての発言は、「reallocが返ってきたときにブロックの終了後に任意のバイトにアクセスすることは未定義です。

このような仕様では、reallocの実装では、末尾のバイトにヘッダーを入れることができます。定義されていない動作であるということは、アプリケーションが(概念的には消えた)バイトから読み込もうとすると、ヘッダーを読み取ることになります。それが書いても、それはあなたのヘッダーを殺すでしょう - アプリケーションはそれをしてはいけません。

1

それは再割り当てされているので、今それはアプリによってリリースされており、あなたのマネージャーに属しています。それは新しいポインタでそれをclobberingを開始するのは正常です。