一、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);