下面是自己写的一段极简单的模拟STL中的内存管理方法,仅是个人理解,而且,只模拟我自己理解的部分
1 #include "stdlib.h" 2 3 union obj 4 { 5 union obj* next; 6 char data[1]; // 这个char* data本是为了理解起来更容易而声明的,但是我第一次看到它却被搞糊涂了,因此干脆简化成了下面的版本,功能上一模一样 7 }; 8 9 struct memory_space_ptr 10 { 11 struct memory_space_ptr* next; // 这个指针很有技巧:如果该空间是可用的,这个指针用来指向下一个可用空间;如果这个空间被用了,这个指针就会被覆盖 12 }; 13 14 int main(int argc, char* argv[]) 15 { 16 // 申请空间,建立free_list的过程 17 void* res = malloc(16); 18 memory_space_ptr* third = (memory_space_ptr*) res; 19 third->next = NULL; 20 21 res = malloc(16); 22 memory_space_ptr* second = (memory_space_ptr*) res; 23 second->next = third; 24 25 res = malloc(16); 26 memory_space_ptr* first = (memory_space_ptr*) res; 27 first->next = second; 28 29 memory_space_ptr* free_list[16]; // 每一个allocator维护一个自己的16个(指向可用空间的指针的链表的)头指针 30 free_list[1] = first; // 每个链表维护的空间大小不同,free_list[0]维护8字节的可用空间链,free_list[1]维护16字节的可用空间链,后面依次加8字节 31 32 // 使用和回收free_list中的空间的过程 33 { 34 35 char* str = "123456789012345"; 36 37 // 使用第一个空间 38 char* free_space = (char*)free_list[1]; // free_list[1] 提供一个可用空间的指针 39 free_list[1] = free_list[1]->next; // free_list[1] 自己跳转到下一个可用空间 40 strcpy(free_space, str); 41 printf("%s ", free_space); 42 43 // 使用第二个空间 44 char* free_space_2 = (char*)free_list[1]; // free_list[1] 提供一个可用空间的指针 45 free_list[1] = free_list[1]->next; // free_list[1] 自己跳转到下一个可用空间 46 strcpy(free_space_2, str); 47 printf("%s ", free_space_2); 48 49 // 回收第一个空间 50 ((memory_space_ptr*)free_space)->next = free_list[1]->next; // 接过free_list[1]所指向的下一个可用空间 51 free_list[1]->next = (memory_space_ptr*) free_space; // free_list[1]则指向刚刚回收的这块空间 52 53 // 回收第二个空间 54 ((memory_space_ptr*)free_space_2)->next = free_list[1]->next; 55 free_list[1]->next = (memory_space_ptr*) free_space_2; 56 57 58 /* 59 // 再次利用。。。 60 free_space = (char*)free_list[1]; // free_list[1] 提供一个可用空间的指针 61 free_list[1] = free_list[1]->next; // free_list[1] 自己跳转到下一个可用空间 62 strcpy(free_space, str); 63 printf("%s ", free_space); 64 // 。。。 65 */ 66 } 67 getchar(); 68 return 0; 69 }