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

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

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

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


相关推荐

  • 交换机LBD模块

    交换机LBD模块一 概述二 页面参数解析三 功能总结

    2025年8月29日
    2
  • maven的groupid是什么(maven parent标签)

    GroupID是项目组织唯一的标识符,实际对应JAVA的包的结构,是main目录里java的目录结构。ArtifactID就是项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称。

    2022年4月17日
    208
  • 动态库依赖关系_查看运行的动态库

    动态库依赖关系_查看运行的动态库1前言这两天在编写一个插件系统Demo的时候,发现了个很奇怪的问题:插件加载器中已经链接了ld库,但是应用程序在链接插件加载器的时候,却还需要显式的来链接ld库。否则就会报:DSOmissingfromcommandline。这个报错翻译过来就是没有在命令行中指定该动态库。这个报错就很搞事了,你说你明明知道需要哪个库,为什么不直接帮我链接呢,非得我显示的在命令行中指定呢?2现象描…

    2022年9月1日
    3
  • anaconda怎么和pycharm配合使用_pycharm怎么和anaconda结合

    anaconda怎么和pycharm配合使用_pycharm怎么和anaconda结合pycharm与anaconda的结合使用pycharm和anaconda的优点大家都有所了解了,这里我主要说明的是如何使用anaconda创建python的不同环境,在不同环境中安装不同版本包,接着使用pycharm创建项目关联anaconda中我们所创建虚拟环境中的python解释器。Pycharm的安装pycharm的下载地址:网上很多的下载说明,这里就不再赘述,下载最新版即可。Anacondaanconda下载地址登录官网下载最新版即可,完成安装。开始讲解前,我们先明确一下Pytho

    2022年8月27日
    8
  • SSH学习过程

    SSH学习过程学习之struts2:2013年4月24日struts2的练习项目基本完成,还存在部分疑问。     时值五月,开始学习hibernate,希望继续努力~

    2022年6月24日
    36
  • 数据库索引的作用和长处缺点

    数据库索引的作用和长处缺点

    2021年11月29日
    49

发表回复

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

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