2017-04-11 7 views
1

私は現在、mallocfreeという独自の実装を作成しようとしています。Malloc /フリー独自の実装

return (block + 1); 

しかし、私:

block = sbrk(totalSize); 

その後、いくつかの他のコード

、最終的に彼らreturnがある:私は自由memoryspaceを要求するいくつかの実装が見つけた私の研究の間に

+ 1が必要な理由を理解していない。

なぜ、実装にはmagic numberstructにあるのかわかりません。

私はすでにウェブとstackoverflowを検索しましたが、私の質問に対する答えは見つかりませんでした。

+1

_彼らはなぜ魔法の番号を持っていますか?実際のソースコードを見ずに伝えるのは難しいです。 _なぜ「+ 1」はありますか?また、実際のソースコードを見ずに伝えるのは難しいです。 –

+0

例:https://github.com/danluu/malloc-tutorial/blob/master/malloc.c – TheDoctor

+0

また、 'mmap'について聞いたことがありますか? –

答えて

5

あなたのアロケータからメモリを返しました。すべてうまくいって、ユーザーは何かをして、あなたのfreeにポインタを与えます。それだけです、あなたが得るのは住所です。

  1. それはあなたによって割り当てられたことがそもそも:

    はどのようにして一人のアドレスから知ることになっていますか?

  2. あなたはすでにそれを解放していませんか?
  3. メモリブロックはどの程度の大きさですか?

のメタデータを保存する必要があります。あなたが記述した例で示されたアプローチは、呼び出し元に与えた生のメモリの直前にメタデータをmallocとして保存することです。そのようにして、あなたがしなければならないことをすべて取得するには、手渡されたアドレスのポインタ演算の単純なビットがfreeです。

その後、保存するメタデータはあなた次第です。マジックナンバーは、次のブロックが割り当てられたことを記録する1つの方法です。そのビットパターンが十分に「別個」の場合、自分で割り当てていないブロックを解放しようとすることはめったにありません。

+1

さらに、この例ではOPがコメントにリンクされているように見えますが、ポインタ ' 'sbrk()'によって返されたポインタは、 'struct block_meta *'という名前の型です。コースの結果の1つを追加すると、そのような構造の直前のものへのポインタになります。 –

2

ストーリーテラーはほとんどの話をしています! Punは意図した。

他の2点。最初に、malloc()の頻繁に欠けている要件は、整列したメモリを返すことです。 malloc()はそれが何を割り当てているか知らされていないので、「最大アラインメント」を持つブロックを返すことが必要です。 intのようなものが奇数アドレスで開始できない(または効率的でない)場合は、+1が丸められている可能性があります。そのような状況では、奇妙な長さのブロックを返すのはあまり意味がありません。

第2に、もう1つのスマートなデバッグ機能は、バッファエンドの上書きをチェックするためにブロックの最後にいくつかのよく知られたパターンを入れることです。

私は個人的には0xDEADC0D3が4バイトの良いブロックだと思っていますが、それはユーモアのセンスです。

関連する問題