学习STL中的内存管理

下面是自己写的一段极简单的模拟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 }
原文地址:https://www.cnblogs.com/zanzan101/p/3327266.html