【C++】内存管理

你好,我是 L_may


前言

这章主要讲内存分布、C++内存开辟和释放的新玩法、new和delete的实现原理

最后讲一些面试题,在面试时内存这一块问的也比较多,所以可以多看看书

推荐《深入理解计算机系统》

一、内存分布

9efdcd2d05424d678c1e9429aa2488fb.png

注意:

  • 栈是向下增长 、空间比较小、存放临时的数据
  • 堆,空间比较大,可以向上增长


二、动态内存

1.malloc、calloc、realloc区别

  • malloc是在堆上直接申请空间
  • calloc在申请完空间后,将空间初始化为0
  • realloc是扩容,分为原地扩和重新开辟

当后面空间足够时,直接扩增需要的空间,后面空间不够时,会在别的地方重新开辟一块空间,然后将原来的值拷贝过去,释放旧空间,返回新空间地址。

2.new和delete

  • fbb236cdb0594c358b072ff0932d1228.png
  • new的用法  new +类型 +[]个数 ,返回类型是指针
  • new申请一个空间 后面不用  [ ]
  • 在操作内置类型new和malloc效果完全一致,在操作自定义类型时,new会调用构造函数,malloc不会调用
  • 方括号、圆括号不能同时出现

3.delete和free

0494b7c242d346ceb4e80d32e98edea3.png

 注意:

  • delete删除空间
  • 如果要删除的空间只有一个,就不能加 [ ]
  • 在操作内置类型free和delete效果完全一致,在操作自定义类型时,free会调用析构函数,delete不会调用

4.operator new &&operator delete(重点)

  • operator new 

与malloc一样用法完全一致

f34c47d556814efc92b01cdefc5a0b1d.png

 差别在于operator new在开辟空间失败时,会抛bad_alloc类型异常

而malloc失败则返回0

在底层上,operator是通过malloc实现

  • operator free

f90b416f94aa4766af30e8ef7a017a46.png

 效果、操作与free完全一致,在内存释放失败都会终止程序

而operator的出现则是为了配对operator new

  • operator new的类专属重载(了解)

平时我们用的new是在堆上开空间,坏处就是访问速度慢,所以可以自己重载一个operaotor new 

和operator delete 使数据在内存池申请和释放,提高效率,了解即可

fa74bd50b39747a7bde5bd1975a2d5d4.png


 三、new和delete实现原理

  • 动态内存开辟和释放,一共学了三种malloc、operator new 、new   || free、operator delete 、delete
  • 对于申请内置类型 malloc和 operator new 基本一致,差别在operator new失败会抛异常,malloc则会返回NULL.    自定义类型free、delete和operator delete 完全一致,失败都是终止程序
  • 对于自定义类型,malloc、operator new 都不会调用构造函数,new会调用构造.  delete 会调用析构函数
  • new T[N]表示开辟N个类型为T的空间,则调用N次构造函数

定位new(了解)

对于已经分配内存的原始空间,调用构造函数

格式:new (place_address) type
dc40a398c09c4fcaa099f004404b1fb2.png

四、malloc、free与new、delete的区别(常见面试题)

  • 效果:new会调用构造函数,失败抛异常,malloc失败返回NULL
  • 概念:malloc是函数,new是操作符
  • 用法:malloc参数传字节,返回值是void*  ,new后跟类型,返回是类型的指针

五、内存泄漏(重点)

  • 概念

        :因为错误或者疏忽,造成程序没有释放已经不再使用的内存。失去了对某段内存的控制

  • 危害

        :长期运行的程序出现内存泄漏,会导致响应越来越慢,最终卡死

  • 分类

        :  1.堆泄漏。malloc、realloc、calloc、new开辟的内存没有释放,导致内存失去利用机会

              2.系统资源泄漏:系统分配的资源没有使用对应的函数释放掉,导致系统不稳定。

  • 避免

        :事先检查(智能指针)

            事后检查


总结

  • 内存管理涉及程序的方方面面
  • 知道代码在内存上位置
  • 熟悉new和free操作与malloc的区别
  • 防止内存泄漏,要养成良好的代码习惯,用完就销毁

————编程没有捷径

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深度搜索

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值