C++内存管理9 重载上

C++内存管理9 重载上,第1张

回顾与复习:
下面这个是表达式,表达式不可以改变不可重载。

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 同理。

以上来自侯捷老师视频仅用于学习。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1354241.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-14
下一篇2022-06-14

发表评论

登录后才能评论

评论列表(0条)

    保存