1、解释:
new operator:指我们在C++里通常用到的关键字,比如A* a = new A;
operator new:它是一个操作符,并且可被重载(类似加减乘除的操作符重载)
A* a = new A;
2、执行过程:
- 由
operator new(size_t)
来分配内存,如果类A重载了operator new
,那么将调用A::operator new(size_t )
,否则调用全局::operator new(size_t )
,后者由C++默认提供 - 调用A::A()构造对象;
- 返回分配指针。
注:这里的重载遵循作用域覆盖原则,即在里向外寻找operator new的重载时,只要找到operator new()函数就不再向外查找,如果参数符合则通过,如果参数不符合则报错,而不管全局是否还有相匹配的函数原型。
3、placement new的应用:
// placement new
#include <new>
A* p = (A*)::operator new(sizeof(A)); //分配
new(p) A(); //构造
p->~A(); //析构
注:注意sizeof(A)用于求需要分配内存大小。
4、重载operator new:
类内重载operator new操作符,在调用new关键字时就会首先调用自己的重载版本。
class A{
public:
//重载形式1
static void *operator new(size_t size)
{
std::cout<<"call A operator new"<<std::endl;
return malloc(size);
}
//重载形式2
static void operator delete(void *ptr);
void* A::operator new(size_t size)
{
std::cout<<"call A operator new"<<std::endl;
return ::operator new(size);
}
...
};
注:重载operator new操作符函数需要为static
,因为其属于类,且先于类对象存在。
本文的来源:
我学习中的疑惑:什么情况下调用自己在类内重写的operator new函数?
高手的解答:【C++】C++ 内存分配(new,operator new)详解 此文特别推荐看,写的非常好。
总结:
1、new operator会调用operator new函数,operator new函数可重载,且类内重载需为static。
2、operator new中会首先计算sizeof(A)作为参数。
3、特别推荐看,【C++】C++ 内存分配(new,operator new)详解 ,写的非常好。