当前位置: 首页 > wzjs >正文

中国建设网官方网站企业全国互联网营销大赛官网

中国建设网官方网站企业,全国互联网营销大赛官网,手机界面设计素材,中国建设银行悦生活网站🌟 各位看官好,我是egoist2023! 🌍 种一棵树最好是十年前,其次是现在! 🚀 今天来学习C内存管理的相关知识。 👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享…

🌟 各位看官好,我是egoist2023

🌍 种一棵树最好是十年前,其次是现在!

🚀 今天来学习C++内存管理的相关知识。

👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更多人哦

目录

内存分布

内存管理

new和delete实现原理

operator new与operator delete函数

内置类型

自定义类型

定位new

malloc/free和new/delete的区别


内存分布

在上图中,各部分变量分配在 A.栈   B.堆   C.数据段(静态区)    D.代码段(常量区)  哪个区域呢?

  1. globalVar是全局变量在数据段;
  2. staticGlobalVar是静态全局变量,同样在静态区;
  3. staticVar由于static的修饰,是静态局部变量,因此也在静态区;
  4. 非静态局部变量、数组都是存在栈区。因此num1,char2都是在栈区;
  5. char2是一个数组,把后面常量串拷贝过来到数组中,数组在栈上,所以*char2是在栈上的;

          6.pChar3和ptr1都是指针变量,是存在栈区上的。因为是指针,pChar3是指向字符串的,字符串是在常量区的,因此*pChar3是在常量区的。ptr1指向的是堆区上的一块空间,因此*ptr1得到的是动态申请空间的数据在堆区。

    1. 又叫堆栈 -- 非静态局部变量 / 函数参数 / 返回值等都是在栈区的,栈是向下增长的。
    2. 内存映射段 是高效的 I/O 映射方式,用于装载一个共享的动态内存库。用户可使用系统接口
    创建共享共享内存,做进程间通信。
    3. 用于程序运行时动态内存分配,如malloc、calloc都是向堆区申请空间,堆是向上增长的。
    4. 数据段(静态区) -- 存储全局数据和静态数据。
    5. 代码段(常量区) -- 可执行的代码 / 只读常量,如字符串。

    内存管理

    new和delete实现原理

    在C语言中,动态内存管理方式有:malloc/calloc/realloc/free。

    由于C语言的使用过于麻烦和一些缺陷(只能分配空间,需要手动初始化之类)。在C++中引入了newdelete操作符进行动态内存管理

    new和delete的简单使用

    // 动态申请一个int类型的空间
    int* ptr4 = new int;
    delete ptr4;// 动态申请一个int类型的空间并初始化为10
    int* ptr5 = new int(10);
    delete ptr5;// 动态申请10个int类型的空间
    int* ptr6 = new int[10];
    delete[] ptr6;

    动态申请n个空间时,与delete[]搭配使用。new和delete似乎只是简化了C语言中的malloc和free,并能指定初始化 ,那它们真正的区别在于哪里呢?

    来看看如下一段程序。

    class A
    {
    public:A(int a = 0): _a(a){cout << "A():" << this << endl;}~A(){cout << "~A():" << this << endl;}
    private:int _a;
    };
    int main()
    {// 内置类型是几乎是一样的int* p3 = (int*)malloc(sizeof(int)); // Cint* p4 = new int;free(p3);delete p4;// 自定义类型A* p1 = (A*)malloc(sizeof(A));A* p2 = new A(1);free(p1);delete p2;A* p5 = (A*)malloc(sizeof(A) * 10);A* p6 = new A[10];free(p5);delete[] p6;return 0;
    }

    通过调试发现在针对内置类型时,new和malloc都是动态申请了一块内存,几乎是一样的;

    但在针对自定义类型时,new先开了一块空间,然后再去调用了构造函数。delete同理在针对自定义类型时也会去调用对应的析构函数。因此new/delete malloc/free最大区别是new/delete除了申请/销毁空间还会调用对应构造/析构函数。

    即new = 开空间 + 构造函数 , delete = 析构函数 + 销毁空间 。

    operator newoperator delete函数

    new/delete的开/销毁空间与malloc/free有什么区别呢?

    实际上new底层是调用operator new全局函数来申请空间,delete在底层通过 operator delete全局函数来释放空间。

    而operator new函数实际是对malloc进行了封装,operator delete函数是对free进行了封装。区别在于若申请空间不足或出错时,采用了抛异常的玩法,不会终止程序(后续章节会讲到)。

    内置类型

    如果申请的是内置类型的空间, new malloc delete free 基本类似,不同的地方是:
    new/delete 申请和释放的是单个元素的空间, new[] delete[] 申请的是连续空间,而且 new 在申
    请空间失败时会抛异常, malloc 会返回 NULL

    自定义类型

    new的原理
    调用 operator new 申请空间
    构造函数
    delete的原理
    析构函数
    调用 operator delete 释放空间
    new T[N] 的原理
    调用operator new[]函数,实际调用operator new函数完成N个对象空间的申请
    申请空间上执行 N 次构造函数
    delete[] 的原理
    空间上执行 N 次析构函数
    调用operator delete[]释放空间,实际调用operator delete来释放空间

    定位new

    定义:为已分配的原始内存空间中调用构造函数初始化一个对象

    使用方式:new(place_address) type或new(place_address) type(initializer-list)

    place_address 必须是一个指针, initializer-list 是类型的初始化列表。如:
    new (p) A;

     那什么时候会用到定位new呢?一般是与内存池(池化技术)搭配使用,因为内存池的内存并未初始化,需要new来帮助自定义类型对象调用构造函数完成初始化。这里浅浅地了解下内存池。

    应用场景:malloc、calloc都是向堆中申请内存,但如果申请频繁的话,就会增大系统内存分配函数的开销,因此需要借助内存池来减少开销。实际上,stl库中很多都用到了内存池的技术,如vector。

    malloc/freenew/delete的区别

    它们都是从堆上申请空间,不同点如下。

    malloc/freenew/delete
    函数操作符
    不会初始化初始化
    手动计算空间大小其后跟上空间类型,申请多个对象,用[]指定个数
    返回值为void*,要强转不需要强转
    申请失败,返回NULL

    抛异常

    开/销毁空间开/销毁空间+构造/析构

    http://www.dtcms.com/wzjs/511100.html

    相关文章:

  1. 建筑设计说明万能模板网站seo诊断报告
  2. 贵州 网站建设千锋教育培训机构地址
  3. 网站设计师介绍如何自己开发网站
  4. dw自己做的网站手机进不去网站链接查询
  5. 网站开发前景怎么样百色seo外包
  6. 网站建立基本流程win7系统优化软件
  7. 初学者做网站的软件市场营销网站
  8. 记事本做网站素材代码充电宝seo关键词优化
  9. 12306网站是哪个公司做的中国婚恋网站排名
  10. 做包装盒效果图的网站百度获客平台怎么收费的
  11. 外贸网站建设注意店铺运营
  12. 郑州本地做团购的网站站长工具下载app
  13. 中小型网站建设山西免费网站关键词优化排名
  14. 滨州网站建设公司创建属于自己的网站
  15. 创意工作室网站谷歌优化教程
  16. 玉树州网站建设公司制造企业网站建设
  17. 如何做好企业网站的推广深圳网站seo优化
  18. 专业做网站团队佛山网页搜索排名提升
  19. 建站网站多少钱网址收录入口
  20. wordpress入门教程网站是怎么优化的
  21. 分享设计的网站网络广告推广方式
  22. 一个网站的二级目录在另一台服务器上_怎么做西安做网站的网络公司
  23. 哪里网站做的好今日头条热搜榜前十名
  24. 网站怎么认证sem竞价专员
  25. 中关村在线网站的建设网络营销方式与工具有哪些
  26. 合肥城乡建设网站灰色关键词排名代做
  27. 泉州建设系统培训中心网站免费网站在线观看人数在哪直播
  28. 网站开发分析报告跨境电商平台
  29. 财务软件排行榜前十名好用的seo软件
  30. 美化网站代码新型网络营销模式