
回顾与复习:
下面这个是表达式,表达式不可以改变不可重载。
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:"<<i<<" "<<"j:"<<j<<endl;}
~Complex(){cout<<"free"<<endl;}
};
void* myAlloc(size_t size){
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<Foo*>(mem);
p->Foo::Foo(1,2);
}catch{
//省略
}
//other code
p->~Foo();
operator delete(p);
上图的两个operator函数其实必须是static,因为调用operator函数时往往就是正在创建对象的时候,手里还没有对象,无法通过对象来调用一般的函数,让这两个不通过对象调用起来。
array new 同理。
以上来自侯捷老师视频仅用于学习。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)