内存管理(一)_内存管理技术有哪些

内存管理(一)_内存管理技术有哪些内存管理(一)

大家好,又见面了,我是你们的朋友全栈君。

c++ 内存管理(一)

分配 释放 所属 可否重载
malloc free() C函数 不可
new delete C++表达式
::operator new() ::operator delete() c++函数
allocator::allocate() allocator::deallocate() c++标准库 自由搭配任何容器

new

A *a = new A();

上面代码我们申请了一个A类的对象使用new。

new里面的步骤
1.申请空间
2.调用A类的构造函数
3.返回指针

/** new中大概是这样调用的 */ A* a=NULL; try{ void* mem = operator new(sizeof(A));//申请内存并返回指针 a = static_cast<A*>(mem); a->A::A(); //调用构造函数,但是不允许这样做,只有编译器才能主动调用构造函数 } catch(bad_alloc &memExp){ cerr<<memExp.what()<<endl; }

operator new

那么operator new中又做了什么呢

/* 这是一个最简单的重写这个函数的方法,没有处理申请不到内存的情况。 */ void* operator new(size_t sz) { return malloc(sz); } 实际上operator new的伪代码 void* operator new(std::size_t size)throw(std::bad_alloc) { using namespace std; if(size==0) //处理 0 byte申请 size=1; //视为 1 byte申请 while(true) { 尝试分配size bytes if(分配成功) return 指针(一个指向分配的内存空间的指针) //分配失败 new_hander globalHandler = set_new_handler(0)l set_new_hander(globalHandler); if(globalHandler) (*globalHandler)(); else throw std::bad_alloc();//抛出异常 } }

可以看到operator new中不断尝试申请内存
new->::operator new->malloc()

//析构函数 ~A() { printf("~A\n"); } //重载operator delete void operator delete(void *p) { printf("free\n"); free(p); } //main函数部分 ... a = new A(); a->~A(); operator delete(a); ... stdout输出 ~A free 可以通过指针主动调用析构函数,再用operator delete释放内存

placement new

有时候我们需要在已经分配的内存上构造新的对象

class A
{
public:
    int a;
    void* operator new(size_t sz)
    {
        return malloc(sz);
    }
    void* operator new(size_t sz,void* p) //什么都不做直接把已经申请的空间返回
        return p;
};
int main()
{
    void *buf = NULL;
    A *a = NULL;
    try
    {
        buf = operator new(sizeof(A));  //申请buf空间
        a = new(buf)A();                //在已申请的空间buf上创建对象
        /*
        这样相当于a = new(buf)A();这一句只执行的构造函数,绕过了a->A::a()这样直接调用构造函数,相当于我们直接调用了构造函数
        */
    }
    catch(bad_alloc &memExp)
    {
        cerr<<memExp.what()<<endl;
    }
    return 0;
}

转载于:https://www.cnblogs.com/xcantaloupe/p/10582236.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106917.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • cloudsim教程_云计算教程

    cloudsim教程_云计算教程如何使用cloudsim?直接上github搜索cloudsim首先来个源代码,这个是cloudsimexample1这个代码的目的是创造一个主机,一个任务的数据中心。

    2022年10月13日
    2
  • mysql优化的几种方法_sgd优化算法

    mysql优化的几种方法_sgd优化算法1.SGDBatchGradientDescent在每一轮的训练过程中,BatchGradientDescent算法用整个训练集的数据计算costfuction的梯度,并用该梯度对模型参数进行更新:Θ=Θ−α⋅▽ΘJ(Θ)\Theta=\Theta-\alpha\cdot\triangledown_\ThetaJ(\Theta)优点:costfuction若为凸函数,能

    2025年8月18日
    3
  • G

    G

    2021年7月27日
    61
  • unity3d实战_unity3d游戏制作

    unity3d实战_unity3d游戏制作[Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手"我在学Unity3D,TankSniper(坦克狙击手)这个项目是用来练手的。游戏玩法来自这里(http://www.4399.com/flash/127672_3.htm),虽然抄袭了人家的创意,不过我只用来练习(目前还很不成熟,离人家的境界相差很大),坦克、导弹、建筑模型来自网络,应该不会有版权问题吧。由于模型和代码总共…

    2022年8月10日
    7
  • 微信web开发者工具详解_微信web开发者工具官方下载

    微信web开发者工具详解_微信web开发者工具官方下载一、微信小程序web开发工具下载地址 1.1 在微信公众平台-小程序里边去下载开发工具下载地址。1.2下载后安装一下就可以使用了:二、创建项目 2.1 微信小程序web开发工具需要扫码登陆,所以必…

    2025年5月27日
    4
  • tomcat无法启动程序 Error filterStart

    tomcat无法启动程序 Error filterStart有时在启动tomcat时,有的应该程序无法启动,tomcat报错信息如下:org.apache.catalina.core.StandardContextstartSEVERE:ErrorfilterStartorg.apache.catalina.core.StandardContextstartSEVERE:Contextstartupfaileddueto…

    2022年7月11日
    15

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号