der Heap für das Aufspalten ist eine verkettete Liste von Strukturen der folgenden Definition:Ausführungs Malloc: Fall einen Block
struct block
{
/*header + block*/
bool freeSpace;
block * prev;
block * next;
size_t size;
char block_part[];
};
ich auf folgenden Fall gerade arbeite:
Wenn der erste Block Speicher finde ich ist so groß, dass es sowohl den neu zugewiesenen Block als auch einen weiteren Block aufnehmen kann, dann wird der Block in zwei geteilt; ein Block, um den neu zugewiesenen Block und einen verbleibenden freien Block zu halten.
(Beachten Sie, dass, wenn es ein bisschen größer ist als das, was ich brauche, aber nicht groß genug für einen neuen Block (dh es ist nicht groß genug, die Metadaten eines neuen Blockes) zu halten, habe ich bei der ungenutzten Raum habe Ende des Blocks.)
Mein Code ist der folgende. Wenn ich speziell diesen Fall teste, stürzt mein Programm mit einem segfault ab. Könnte jemand sehen, was das Problem ist? Vielen Dank.
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);
Sicherlich teilen Sie nur einen Block, wenn Sie keinen Block finden, der groß genug ist? Und bitte entfernen Sie die Leerzeichen auf jeder Seite der '->' –
Das ist nicht, wenn ich geteilt habe. Ich spalte, wenn ich einen Block finde, der zu groß ist. @WeatherVane – Jobs
Ich schlage vor, dass Sie die Größe der Metadaten der Speicheranforderung hinzufügen, bevor Sie beginnen. –