回顾与复习:
下面这个是表达式,表达式不可以改变不可重载。
Foo* p =new Foo(x); //其他代码 delete p;
看这两句具体做了什么
//Foo* p=new Foo(x)这句 Foo* p=(Foo*)operator new(sizeof(Foo)); //这里省略了cast(类型转换) new(p)Foo(x); //其他代码 //delete p这句 p->~Foo(); operator delete(p)
这两个operator new和operator delete做了什么呢
::operator new(size_t);//这里面调用malloc(size_t); //other code ::operator delete(void*);//调用free(void*);
我们可以在一个class里重载operator new和operator delete,这样有优先权。
内存管理就是希望我们能接管这个动作。
容器里面p的分配放置在分配器里面。
容器Container
T* p=allocate(); construct();//包装构造函数 //other code destroy();//包装析构函数 deallocate p;
重载::operator new和::operator delete
个人实例:
class Complex{
public:
int i;
int j;
Complex(){}
Complex(int i,int j):i(i),j(j){cout<<"i:"<cout<<"free"<
return malloc(size);
}
void myFree(void* ptr){
return free(ptr);
}
inline void* operator new(size_t size){
cout<<"global new() n";
return myAlloc(size);
}
inline void operator delete(void* ptr){
cout<<"global delete() n";
myFree(ptr);
}
int main() {
Complex* p=(Complex*)operator new(sizeof(Complex));
new(p)Complex(1,2);
p->~Complex();
operator delete(p);
}
运行结果
重载operator new和operator delete
Foo* p=new Foo; //other code delete p;
这里的两句执行的是下面的过程
try{
void* mem = operator new(sizeof(Foo));
p = static_cast(mem);
p->Foo::Foo(1,2);
}catch{
//省略
}
//other code
p->~Foo();
operator delete(p);
上图的两个operator函数其实必须是static,因为调用operator函数时往往就是正在创建对象的时候,手里还没有对象,无法通过对象来调用一般的函数,让这两个不通过对象调用起来。
array new 同理。
以上来自侯捷老师视频仅用于学习。



