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和抛异常

你可能感兴趣的:(C++知识点,c++)