Chinaunix
标题:
做了几个关于C++对象数组的几个实验
[打印本页]
作者:
missjiang
时间:
2007-09-25 13:34
标题:
做了几个关于C++对象数组的几个实验
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 编辑
]
作者:
antigloss
时间:
2007-09-25 18:46
无论删除什么(new 分配的)数组,都不需要指明数组大小,直接 delete [] p; 就可以了
作者:
namtso
时间:
2007-09-25 21:52
删除数组的时候,指定数组大小是一种过时的做法,出于兼容,有些编译器不会报错,但有些编译器会给出一个警告。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2