/ 释放这个地址,即标记这个地址可用;
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 |