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

看如下代码:

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]为随机数。

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

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

而不定义析构函数时,意味着用户不会自己控制释放“堆内存”,所以就没必要逐个调用析构函数了,所以就没必要存储数组元素个数了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值