C++(学习) ——new与delete 运行过程 & operator new与operator delete的重载

一、operator new

C++可以利用new与delete来分配空间与释放空间,new与delete在调用时,其内部其实包含了三个步骤:

假如T代表一个类型(T可以表示内置类型,自定义类型(class),指针类型)
对于语句:T* p = new T(value)的执行过程:
1.首先调用void * operator new(std::size_t size)函数,尝试分配空间。若失败则转到异常处理函数,成功则继续。
2.执行类T相应的构造函数。
3.将void *指针 转化为 T类型指针并返回。

等价伪代码为:
1.void * ptr = T::operator new(sizeof(T)); //T为自定义类型时

void* ptr = ::operator new(sizeof(T)); //T为内置类型或指针等情况
2.T::T(ptr,value);
3.return (T*)ptr;

说明:
1.operator new(std::size_t size);中 size为想申请的字节数
2.size_t 为编译器提供的内置类型,本身为unsigned in

  • 对于new的本身是不能重载的,new的操作一定包括上面的三个过程,这对于用户来说是,无法改变的。
  • 所能改变的只有自定义 void * operator new(std::size_t size)这个函数
  • 可自定义重载的operator new 与 operator delete。若没有显式提供,则使用全局的::operator new 与 ::operator deldete.
  • 重载的函数一定是静态的(static),运算符函数定义成类的成员时,它们是隐式静态的。无须显示地声明 static,当然这么做也不会引发错误。

二、Operator delete

语句:delete p; 的执行过程,也包含三个操作:
1.判读p是否为nullptr,若 p为nullptr则退出。
2.否则执行析构函数 T::~T( );
3.调用void operator delete(void *,std::size_t size)函数,释放空间。

等价伪代码为:
1.if(p==nullptr) return;
2.T::~T( p);
3.T::operator delete(p ,sizeof(T)); //T为自定义类型

::operator delete( p); //T为内置类型或指针等情况

同样与new一样 ,用户重载的只是 operator delete( )函数;

三、示例

根据自己的需要,可以定义自己的operator new 与operator delete:

class A {
public:
 A(int n) {};
 
 void* operator new(std::size_t);     			 //1
 void* operator new(std::size_t, const string& a);  	 //2
 void* operator delete(void*, std::size_t);    		 //3
};

int main() 
{
 A* p1 = new A(9);    		 //调用1
 A* p2 = new ("张三")  A(8);     //调用2      需要注意多余的参数的位置
 delete p2;      		 //调用3
 delete p1      		 //调用3
 
 return 0; 
}

还可以有多个参数:
void* operator new (size_t classSize, int paraA, int paraB, int paraC);
写法: ClassA pClassA = new (paraA, paraB, paraC) ClassA(value);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值