を分割する場合は、次の定義の構造体のリンクリストです:実装mallocの:ヒープブロック
struct block
{
/*header + block*/
bool freeSpace;
block * prev;
block * next;
size_t size;
char block_part[];
};
私は次のような場合に取り組んでいます:
の最初のブロックの場合私が見つけたメモリは非常に大きいので、新たに割り当てられた ブロックと別のブロックの両方に対応することができます。ブロックは2つに分割されます。新たに 割り当てブロックを保持する1つのブロックと、残りの空きブロックとを含む。
(私が必要とするサイズよりも少し大きいが、新しいブロック用に十分な大きさではない(つまり、新しいブロックのメタデータを保持するのに十分な大きさではない)ことに注意してください。ブロックの最後)
私のコードは以下の通りです。このケースを特にテストすると、私のプログラムはsegfaultでクラッシュします。誰かが問題が何であるかを見ることができますか?ありがとう。
do{
if (ptr -> freeSpace && ptr -> size >= size){
/*first suffient free block is found*/
ptr -> freeSpace = false;
if (ptr -> size > size + sizeof(struct block)){
/*if big enought for 'size' AND metadata of a new block, split the block*/
struct block * returnPtr = memset((ptr -> block_part), 0, size);
struct block * added = returnPtr + size;
added -> size = ptr -> size - size - sizeof(struct block);
added -> freeSpace = true;
added -> prev = ptr;
added -> next = ptr -> next;
(ptr -> next) -> prev = added;
ptr -> next = added;
ptr -> size = size;
return returnPtr;
}
ptr -> size = size;
return memset((ptr -> block_part), 0, size);
}
prevPtr = ptr;
ptr = ptr -> next;
}while (ptr);
十分に大きなブロックが見つからない場合は、ブロックを分割するだけですか?そして、 ' - >'の各辺のスペースを削除してください。 –
分割するときではありません。大きすぎるブロックが見つかると分割されます。 @WeatherVane – Jobs
開始する前に、メモリ要件にメタデータのサイズを追加することをお勧めします。 –