1.简述:
(1).自定义重载全局的new 和 delete,在使用new新增对象和delete对象时,会调用自定义全局的new和delete操作,c++内部类也(如char,int等)不例外,同样会调用自定义的new和delete。
(2).也可以定义作用域为当前类的new和delete,即像在类中重载其他操作符一样。
(3).重载 new 时,返回值必须为void* , 且参数必须有size_t 参数(也可以有其他参数),此参数是又编译器计算出来的。重载delete时,返回值必须为void,参数为void*类型。
(4).也可以重载对象数组,和重载对象的区别为在new,delete后面多一个[] 符号即new[],delete[].
(5).同时重载勒全局的new,delete和类内部的new,delete,以类内部为准。
2.代码实现:
class A{
int i;
public:
A():i(0){};
~A(){};
//重载new,delete
void* operator new(size_t sz,void* loc){//分配特定的内存地址loc
std::cout<<"new size:"<<sz<<"byte"<<std::endl;
return loc;
}
//由于此类采用特定的特定的内存地址,所以最好不要使用delete来释放内存,(如果loc为堆内存,问题还不大,是其他存储空间将会发生灾难)而是直接调用析构函数a->A::~A();
//void operator delete(void* loc){
// std::cout<<"delete"<<std::endl;
// ::delete []loc;//什么都没做,直接继承delete操作
//}
void* operator new[](size_t sz){
return ::new char[sz];
}
void operator delete[](void *p){
::delete []p;
}
}
int main(){
void* loc = malloc(sizeof(A));
A *a = new(loc) A();
a->A::~A();
//delete a;//由于malloc也是动态分配的内存,这里也可已使用delete来释放内存,但最好不用,且不能和free连用
free(loc);
}