栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++内存管理9 重载上

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++内存管理9 重载上

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

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/960468.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号