zoukankan      html  css  js  c++  java
  • 学习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 }
  • 相关阅读:
    科研:保持开放的心灵
    jquary实现轮播图(省略了css样式)
    Django实现注册/登录:方法2
    Django实现注册/登录:方法1
    卸载MySQL出现2503,2502解决方法
    安装MySQL出现2503,2502错误解决方法
    Markdown数学公式
    Linux安装Oracle11.2.0数据库
    Python列表生成式
    R语言apply()函数用法
  • 原文地址:https://www.cnblogs.com/zanzan101/p/3327266.html
Copyright © 2011-2022 走看看