- 论坛徽章:
- 0
|
1、删除对象数组时无需指定数组的大小
- class Student {
- char data[4];
- public:
- ~Student()
- {
- printf("~Student\n");
- }
- };
- int main()
- {
- Student * a = new Student[3];
- delete[3] a;
- printf("------------------------------\n");
- Student * b = new Student[3];
- delete[] b;
- return 0;
- }
- 程序输出:
- ~Student
- ~Student
- ~Student
- ------------------------------
- ~Student
- ~Student
- ~Student
复制代码
a和b都指向一个包含有3个student对象的数组,在删除对象数组时无需指定数组的大小,delete[3] a 和delete[] b是等价的。
2、对象数组占有的空间
- class Student {
- char data[4];
- public:
- void * operator new[] (size_t size)
- {
- printf("sizeof(Student[10]) == %d\n", size);
- return NULL;
- }
- /* 没有析构函数 */
- };
- class Teacher {
- char data[4];
- public:
- /* 定义了析构函数 */
- ~Teacher() { printf("~Teacher\n"); };
- void * operator new[] (size_t size)
- {
- printf("sizeof(Teacher[10]) == %d\n", size);
- return NULL;
- }
- };
- int main(int argc, char* argv[])
- {
- new Student[10];
- new Teacher[10];
- return 0;
- }
- 程序输出为:
- sizeof(Student[10]) == 40
- sizeof(Teacher[10]) == 44
复制代码
两者输出不同,我的理解和猜测是:
1、我们重载了new[]运算符,“void * operator new[] (size_t size)”中的参数size是对象数组的大小
2、Student没有析构函数,对象数组占有的空间为10*4
3、Teacher存在析构函数,对象数组占有的空间为10*4 + 4
4、Teacher[10]多出来的4个字节可能用来存储 Teacher[10]数组中的大小,对于如下代码:
- int main()
- {
- Teacher * teachers = new Teacher[3];
- delete[] teachers;
- }
复制代码
使用delete[] teachers时:
- teachers指向的对象数组包括了数组中元素的数目
- 因此delete[]可以遍历该数组,调用每个Teacher的析构函数
- 最后delete[]使用free收回分配出去的44个字节。
而Student没有析构函数,delete[]时就自然就可以省去“遍历该数组,调用每个对象的析构函数”这一步,因此Student[10]数组中无需保存数组中元素的数目。
PS:我在VC++ 6.0中做了这两个实验,也许在其它系统中会有不同的输出。
[ 本帖最后由 missjiang 于 2007-9-25 13:44 编辑 ] |
|