您的位置:首页 > 编程语言 > C语言/C++

C++中,类Class数组长度的问题

2012-08-12 10:40 239 查看
看如下代码:

class OperatorNewCls{
private:
	//
	enum {sz=10};
	int arr[sz];

public:
	/*定义析构函数后,sizeof(OperatorNewCls)的值未改变,
	**但是new OperatorNewCls[size]的值等于(sizeof(OperatorNewCls)*size+4),
	**因为在new OperatorNewCls[size][-1]未知存放了数组的长度size。
	**
	**若不定义析构函数,
	**则new OperatorNewCls[size]的值等于sizeof(OperatorNewCls)*size
	*/
	~OperatorNewCls(){}

	//该函数必须是public的,且必须是static,尽管可以不显示指定static
	void * operator new[](size_t size){
		cout<<"operator[],size="<<size<<endl;
		return malloc(size);
	}
};
void test43(){
	int size=25;
	cout<<"sizeof(OperatorNewCls)="<<sizeof(OperatorNewCls)<<endl;
	int *arr=(int*)new OperatorNewCls[size];
	for(int i=-1;i<size;++i){
		cout<<"arr["<<i<<"]="<<arr[i]<<"\t"<<endl;
	}
}


执行结果如下:



注释掉OperatorNewCls的析构函数~OperatorNewCls()后,执行结果如下:



差别在于OperatorNewCls数组arr的长度:定义析构函数后,长度为1004bytes,arr[-1]为数组元素个数25;注释析构函数后,长度为1000bytes,arr[-1]为随机数。

为什么定义析构函数后,需要存储数组长度?

可能是因为定义析构函数后,意味着用户需要自己控制“堆内存”的释放,因此需要“对数组里的每个对象,逐个调用析构函数”,所以需要存储数组元素个数。

而不定义析构函数时,意味着用户不会自己控制释放“堆内存”,所以就没必要逐个调用析构函数了,所以就没必要存储数组元素个数了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: