new和delete表达式(new和delete表达式的工作步骤)

new表达式的工作步骤

使用new表达式时发生的三个步骤:

  1. 调用名为operator new的标准库函数,分配足够大的原始的未类型化的内存,以保存指定类型的一个对象
  2. 运行该类型的一个构造函数初始化对象
  3. 返回指向新分配并构造的构造函数对象的指针

delete表达式工作步骤

使用delete表达式时发生的两个步骤:

  1. 调用析构函数,回收对象中数据成员所申请的资源
  2. 调用名为operator delete的标准库函数释放该对象所用的内存
void * operator new(size_t sz){
	void * ret = malloc(sz);
	return ret;
}

void * operator delete(void * pointer){
	free(pointer);
}

operator new 和 operator delete 都是静态函数

Q:调用析构函数和对象的销毁是不是等价的?
A:对于堆对象来说,不等价,析构函数只是堆对象销毁过程中的一个步骤。

一个类只能创建栈对象

Q:生成栈对象需要什么条件?
A:构造函数和析构函数都要是公有成员变量

如果要求一个类只能创建栈对象,其意思是在创建出栈对象的同时,不能创建堆对象。以Student类型而言

要达到以上的效果,只需要将operator new放入Student类的private区域。

一个类只能创建堆对象

如果要求一个类只能创建堆对象,其意思是在创建出堆对象的同时,不能创建栈对象。以Student类型而言

要达到以上的效果,只需要将Student类的析构函数放入private区域。注意不要直接调用析构函数,要在类中通过成员函数调用,并且用this指针来调用析构函数。通过destory()成员函数来销毁对象,这里注意直接删除对象本身this,这样会先调用析构函数销毁成员函数资源,然后调用operator delete销毁对象本身。不要仅仅是调用析构函数。析构函数只是对象销毁的其中一个步骤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值