operator new与operator delete函数

operator new与operator delete函数

前面我们了解了new和delete的基本操作, 知道了new和delete是用户进行动态内存申请和释放的操作符, 接下来看一下他们的底层逻辑, 关于底层呢, 涉及到operator new 和operator delete,
之前我们也见过operator关键字, operator+操作符就是操作符重载函数的函数名, 但是operator new和operator delete却不是操作符重载函数 , 他们都是系统提供的全局函数. 只是函数名字叫operator 函数原型为 void* operator new(size_t n),

  • new在底层会先调用operator new全局函数来申请空间

  • delete在底层会通过operator delete全局函数来释放空间

  • 那为什么他们不是运算符重载函数呢 ? ? ?

1. operator new

我们都知道运算符重载函数在调用时可简写, 比如operator++( A a) 可写作operator++(a), 也可写作++a; 那如果operator是一个运算符重载函数的话, 我们也可以将其简写为 new + 数字, 但编译器会报错, 说明明显不行, 但是可以写作operator new(n), 那就说明operator new 不是new的运算符重载函数, 记住, 其实一全局函数. 且功能类似 malloc
但申请空间失败时 比malloc多了一个报错

下面通过operator new的源码来看,

void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc) {
   
	// try to allocate size bytes
 	void *p;
 	while ((p = malloc(size)) == 0)
		if (_callnewh(size) == 0){
   
			// report no memory
			// 如果申请内存失败了,这里会抛出bad_alloc 类型异常
			static const std::bad_alloc nomem;
			_RAISE(nomem);
		}
	return (p);
}

通过观看源码, 我们可发现 operator new 函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回; 申请空间失败,尝试执行空间不足应对措施,如果该应对措施用户设置了,则继续申请,否则抛异常。相当于operator new 函数封装了malloc和抛异常

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值