只能管理大小相同的空闲内存块。
原理:主要是利用一个空闲块记录另一个空闲块的地址,形成一个空闲块链。
所以malloc分配的空间至少能够存储一个地址(8B),才能存储
#include <stdlib.h>
#include <iostream>
using namespace std;
typedef struct Node {
int a;
int b;
} Node;
int main() {
char * free_node = nullptr;
Node* n1 = (Node*) malloc(sizeof(Node)); n1->a = 1;
Node* n2 = (Node*) malloc(sizeof(Node)); n2->a = 2;
Node* n3 = (Node*) malloc(sizeof(Node)); n3->a = 3;
Node* n4 = (Node*) malloc(sizeof(Node)); n4->a = 4;
Node* n5 = (Node*) malloc(sizeof(Node)); n5->a = 5;
// 逻辑上释放n1
printf ("n1: %p\n", n1);
*((char **)n1) = free_node;
free_node = (char *)n1;
// 逻辑上释放n2,追加到n1后面
printf ("n2: %p\n", n2);
*((char **)n2) = free_node;
free_node = (char *)n2;
// 逻辑上释放n3,追加到n2后面
printf ("n3: %p\n", n3);
*((char **)n3) = free_node;
free_node = (char *)n3;
// 遍历空闲链表
char* p = free_node;
while (p != nullptr) {
printf ("%p -> ", p);
p = *((char **)p);
}
printf ("\n");
// 从空闲链表上取下一个空闲块
char* q = free_node;
free_node = *((char **)q);
// 遍历空闲链表
char* p1 = free_node;
while (p1 != nullptr) {
printf ("%p -> ", p1);
p1 = *((char **)p1);
}
printf ("\n");
// 物理上释放全部内存
free(n1);
free(n2);
free(n3);
free(n4);
free(n5);
}