如果一个类或其基类有析构函数,当申请数组指针时,会多出几个字节用于 delete [] 运算符,以便为每一个对象调用析构函数计数。下面是一个测试例子。
1
2
3 #include <cstdio>
4
5 using namespace std;
6
7 //没有定义析构函数
8 class C1
9 {
10 private:
11 char ch[10];
12 };
13
14 //定义有 非虚拟 析构函数
15 class C2
16 {
17 public:
18 ~C2()
19 {
20 }
21 private:
22 char ch[10];
23 };
24
25
26 //基类定义有 非虚拟 析构函数
27 class C3: public C2
28 {
29 private:
30 char ch[10];
31 };
32
33 //定义有 虚拟 析构函数
34 class C4
35 {
36 public:
37 virtual ~C4()
38 {
39 }
40 private:
41 char ch[10];
42 };
43
44 //overload global operator new[]
45 void* operator new[](size_t sz)
46 {
47 printf("alloc memory size:%d bytes\n", sz);
48 return ::operator new(sz);
49 }
50
51 //
52
53
54 int main()
55 {
56 //内置类型
57 printf("sizeof(int):%d\n", sizeof(int));
58 int* pi = new int[10];
59
60 printf("sizeof(C1):%d\n", sizeof(C1));
61 C1* pc1 = new C1[10];
62
63 printf("sizeof(C2):%d\n", sizeof(C2));
64 C2* pc2 = new C2[10];
65
66 printf("sizeof(C3);%d\n", sizeof(C3));
67 C3* pc3 = new C3[10];
68
69 printf("siezeof(C4):%d\n", sizeof(C4));
70 C4* pc4 = new C4[10];
71
72 delete [] pc1;
73 delete [] pc2;
74 delete [] pc3;
75 delete [] pc4;
76
77 delete [] pi;
78
79 }
2
3 #include <cstdio>
4
5 using namespace std;
6
7 //没有定义析构函数
8 class C1
9 {
10 private:
11 char ch[10];
12 };
13
14 //定义有 非虚拟 析构函数
15 class C2
16 {
17 public:
18 ~C2()
19 {
20 }
21 private:
22 char ch[10];
23 };
24
25
26 //基类定义有 非虚拟 析构函数
27 class C3: public C2
28 {
29 private:
30 char ch[10];
31 };
32
33 //定义有 虚拟 析构函数
34 class C4
35 {
36 public:
37 virtual ~C4()
38 {
39 }
40 private:
41 char ch[10];
42 };
43
44 //overload global operator new[]
45 void* operator new[](size_t sz)
46 {
47 printf("alloc memory size:%d bytes\n", sz);
48 return ::operator new(sz);
49 }
50
51 //
52
53
54 int main()
55 {
56 //内置类型
57 printf("sizeof(int):%d\n", sizeof(int));
58 int* pi = new int[10];
59
60 printf("sizeof(C1):%d\n", sizeof(C1));
61 C1* pc1 = new C1[10];
62
63 printf("sizeof(C2):%d\n", sizeof(C2));
64 C2* pc2 = new C2[10];
65
66 printf("sizeof(C3);%d\n", sizeof(C3));
67 C3* pc3 = new C3[10];
68
69 printf("siezeof(C4):%d\n", sizeof(C4));
70 C4* pc4 = new C4[10];
71
72 delete [] pc1;
73 delete [] pc2;
74 delete [] pc3;
75 delete [] pc4;
76
77 delete [] pi;
78
79 }