c++ new/delete的本质和衍生问题

1、首先new/delete不是函数,是运算符,类似+ - x /一样的运算法,如果在代码中使用Base *a=new Base();的话,则执行力三个步骤,一个步骤是调用函数全局函数::operater new(size);函数malloc一个地址,然后返回,接着是调用对象的构造函数创建对象,然后将对象地址返回a. 注意这里:operater new(size)函数可以在Base类中重载,这样根据Base类的需要自行定义分配内存的分配方法,以至于你可以从一个预留的buffer中分配内存。这也是new和malloc不一样的地方。当然既然有operater new这个函数就有operater new[],operater delete, operater delete[]函数,也可以进行重载。

2、delete对象指针时候,会先调用对象析构函数,然后在调用operater delete释放掉内存空间。

3、这里引申出另外一个问题:怎么把一个对象限制在只能在栈上分配?或者只能在堆上分配?
只能在栈上分配意思就是代码中不能使用new来分配对象,那么就把operatror new()函数重载在对象中,然后放在类的private下面,这样调用new时候在调用operatror new()时候就不能调用。一般在类定义中,重载operatror new()函数后,并且放在private就说这个类的对象不能在堆上分配内存。
只能堆上分配的意思,就是定义局部变量对象时候要报错,只能通过new的方式来分配对象。怎么让局部变量比如 Base a报错呢?Base类的析构函数放在private中。因为局部对象栈上分配调用构造函数和析构函数都是编译器调用的,且编译器在生成局部对象之前需要检查对象的类定义中析构函数是否可以访问,如果不能访问则编译报错。因此可以讲析构函数放在private中就能防止这个类的对象在栈上分配空间类。为什么不能把构造函数放在private中呢。因此如果把构造函数放在private中,则不能在栈上分配则只能在new上分配。那么new时候需要调用构造函数,如果构造函数为private则不能被调用,所以不能把构造函数放在private中。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值