设为首页 加入收藏

TOP

C++中的自定义内存管理(二)
2019-05-24 22:07:58 】 浏览:175
Tags:定义 内存 管理
/
释放这个地址,即标记这个地址可用; 48 49 cout << "succeed to free memory: " << p << endl; 50 } 51 } 52 } 53 }; 54 55 char Test::c_buffer[sizeof(Test) * Test::COUNT] = {0}; // 定义一块静态的内存空间,内存空间想要存储的是 Test 对象,最多存储 4 个 Test 对象; 56 char Test::c_map[Test::COUNT] = {0}; // 标记数组,用于标记在那些位置已经创建了对象,作用是标记; 57 58 int main(int argc, char *argv[]) 59 { 60 cout << "===== Test Single Object =====" << endl; 61 62 Test* pt = new Test; // 这里是在 c_buffer 里面的静态存储区当中的空间生成的; 63 64 delete pt; 65 66 cout << "===== Test Object Array =====" << endl; 67 68 Test* pa[5] = {0}; 69 70 for(int i=0; i<5; i++) 71 { 72 pa[i] = new Test; 73 74 cout << "pa[" << i << "] = " << pa[i] << endl; 75 } 76 77 for(int i=0; i<5; i++) 78 { 79 cout << "delete " << pa[i] << endl; 80 81 delete pa[i]; 82 } 83 84 return 0; 85 }

    1,结论:

       1,new/delete 关键字是可以重载的;

       2,重载的意义是改变内存的分配方式,使得动态创建的对象不再位于堆空间里面;

       3,这个实验位于自定义的静态存储区里面的 c_buffer 数组当中; 

    2,拓展:

       1,工程中可以结合不同方法来应用 new/delete 特性;

       2,将本实验的方法和二阶构造法结合在一起,我们就可以创建一个类,并且规定这个类最多产生多少个对象;

       3,单例模式仅仅使得一个类只有一个对象存在,而这里的方法加上二阶构造就可以诞生 N 例模式;

   

4,问题:

    1,如何在指定的地址上创建 C++ 对象?

       1,我们已经掌握了在静态存储区里面创建对象,是否可以扩展下这个方法,在任意的地址上创建对象呢?

       2,通过重载 new/delete 也许就可以在指定的地址上创建对象;

   

5,设计思路:

    1,在类中重载 new/delete 操作符;

    2,在 new 的操作符重载函数中返回指定的地址;

    3,在 delete 操作符重载中标记对应的地址可用;

   

6,自定义动态对象的存储空间编程实验:

  1 #include <iostream>
  2 #include <string>
  3 #include <cstdlib>
  4 
  5 using namespace std;
  6 
  7 class Test
  8 {
  9     static unsigned int c_count;  // 动态实时做决定,所以这个地方就不能有常量;
 10     static char* c_buffer;
 11     static char* c_map;
 12     
 13     int m_value;
 14 public:
 15     /* 动态指定想在什么类型上指定申请对象 */
 16     static bool SetMemorySource(char* memory, unsigned int size)   
 17     {
 18         bool ret = false;  // 返回值为 bool 类型,告诉函数调用者,当前动态空间设置是否成功;
 19         
 20         c_count = size / sizeof(Test);  // 计算传进来的空间可以创建多少对象;
 21         
 22         ret = (c_count && (c_map = reinterpret_cast<char*>(calloc(c_count, sizeof(char)))));
 23         
 24         if( ret )  // 空间至少为 1,且标记指针合法;
 25         {
 26             c_buffer = memory;  // 将指定空间设置到 c_buffer 上;
 27         }
 28         else  // 一切清零;
 29         {
 30             free(c_map);
 31             
 32             c_map = NULL;
 33             c_buffer = NULL;
 34             c_count = 0;
 35         }
 36         
 37         return ret;
 38     }
 39     
 40     void* operator new (unsigned int size)
 41     {
 42         void* ret = NULL;
 43         
 44         /* 有指定的一个具体空间,通过各种计算和验证,看下所指定的空间上面是否可以动态创建对象,标准是 c_count 大于 0,此时意味着通过 setMemorySource() 所指定的空间是可以创建 Test 对象的,则走 if 路径,否则的话,走 else 路径,通过 malloc() 函数得到一片空间; */
 45         if( c_count > 0 )  // 
 46         {
 47             for(int i=0; i<c_count; i++)
 48             {
 49                 if( !c_map[i] )
 50                 {
 51                     c_map[i] = 1;
 52                     
 53                     ret = c_buffer + i * sizeof(Test);
 54                     
 55                     cout << "succeed to allocate memory: " << ret << endl;
 56                     
 57                     break;
 58                 }
 59             }
 60         }
 61         else
 62         {
 63             ret = malloc(size);  // 没有指定具体的在那个空间上生成对象时,通过 ma
首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇42.QT-QSqlQuery类操作SQLite数据.. 下一篇C++中函数异常规格的说明

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目