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

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

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

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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 使用maven打包jar_两个java文件打包成jar

    使用maven打包jar_两个java文件打包成jar目录打包方法方法一:使用maven-jar-plugin和maven-dependency-plugin方法二:使用maven-assembly-plugin(推荐)方法三:使用maven-shade-plugin方法四:使用onejar-maven-plugin方法五:使用spring-boot-maven-plugin方法六:使用tomcat7-maven-plugin参考打包方法方法一:使用maven-jar-plugin和maven-dependenc.

    2022年10月4日
    2
  • Linux IP Masquerade[通俗易懂]

    Linux IP Masquerade[通俗易懂]PMasquerade是Linux发展中的一种网路功能.如果一台Linux主机使用IPMasquerade功能连线到网际网路上,那麽接上它的电脑(不论是在同一个区域网路上或藉由数据机连线)也可以接触网际网路,即使它们没有获得正式指定的IP位址.这使得一些电脑可以隐藏在闸道(gateway)系统後面存取网际网路而不被发现,看起来就像只有这个系统在使用网际网络

    2022年6月16日
    24
  • Ubuntu彻底卸载jdk「建议收藏」

    Ubuntu彻底卸载jdk「建议收藏」参考链接原链接1、移除所有java相关的包(sun,Oracle,openJDK,lcedTeaplugins,GIJ)#apt-getupdate#apt-cachesearchjava|awk'{print($1)}’|grep-E-e’^(ia32-)?(sun|oracle)-java’-e’^openjdk-‘-e’^icedtea’-e’^(default|gcj)-j(re|dk)’-e’^gcj-(.*)-j(re|dk)’-e’

    2022年6月25日
    36
  • exec_command 详解_linux exec命令

    exec_command 详解_linux exec命令2D-Position允许通过拖曳移动绝对定位的对象。AbsolutePosition设定元素的position属性为“absolute”(绝对)。BackColor设置或获取当前选中区的背景颜色。BlockDirLTR目前尚未支持。BlockDirRTL目前尚未支持。Bold切换当前选中区的粗体显示与否。BrowseMode目前尚未支持。

    2025年6月29日
    2
  • pytorch中resnet_通过Pytorch实现ResNet18

    pytorch中resnet_通过Pytorch实现ResNet18对于像我这样刚刚入门深度学习的同学来说,可能接触学习了一个开发工具,却没有通过运用来熟练的掌握它。而ResNet是深度学习里面一个非常重要的backbone,并且ResNet18实现起来又足够简单,所以非常适合拿来练手。我们这里的开发环境是:python3.6.10pytorch1.5.0torchvision0.6.0cudatoolkit10.2.89cudnn7.6.5首先,我们需…

    2022年5月26日
    34
  • eth挖矿显卡的选择_挖矿一般用什么显卡

    eth挖矿显卡的选择_挖矿一般用什么显卡以太坊显卡挖矿指南1.显卡篇挖矿靠显卡核心计算,所以AMD显卡比NVIDA卡更高效。选择AMD卡,要求显卡显存大于2G,推荐购买4G显存显卡.目前市面上可购选择的显卡品牌型号还有速度.蓝宝石-影驰-技嘉-索泰-讯景-微星-迪兰-盈通#显卡型号操作系统挖矿速度驱动版本显卡功耗

    2022年9月30日
    2

发表回复

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

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