我对于内存相关的三个问题的理解和总结——内存泄漏、内存溢出、野指针

内存泄漏累积起来会导致堆溢出,堆溢出和栈溢出构成内存溢出,本文还补充说明了野指针
(归纳自各种文章)

内存泄漏:

  • 定义

    指程序中动态分配的堆内存由于某种原因未被程序释放,造成系统内存的浪费,导致程序运行速度减慢甚至崩溃

  • 典型案例

    malloc、new之后没有及时free、delete

  • 解决方案

    • 在使用完动态分配的内存后,要及时释放
  • 排查

    • 代码审查、单元测试、使用内存检查工具

内存溢出(内存被破坏):

  • 定义

    指在对内存执行写操作的时候,由于超出了内存本身的大小(堆溢出、栈溢出)而写入到其他地方,导致其他内存块被写入数据,严重情况下会导致程序崩溃

  • 堆溢出

    程序中申请了大量动态内存,但未正确释放,后续导致内存耗尽

    这里可见内存泄漏是内存溢出(堆溢出)的原因之一,内存泄漏积累起来会导致内存溢出

  • 栈溢出

    首先要知道栈中一般会存放哪些变量:函数形参、函数返回值、局部变量

    • 函数递归调用过深:

      由于函数的形参、返回值都是分配在栈上的,因此每次递归调用都会在栈上分配一定的空间,当递归层数过深,栈空间将被耗尽,导致栈溢出

    • 局部变量声明不合理:

      栈的空间是有限的,当声明了过大的局部变量,则会占用大量栈空间,甚至导致栈溢出

    • 其它

      每一个线程都会分配一定的栈空间,若线程创建过多(如不小心循环创建),也可能导致栈溢出

  • 解决方案

    • 堆溢出:动态申请的内存要及时释放

    • 栈溢出:局部变量声明、数据结构的使用要合理

  • 排查

    • 代码审查、单元测试、使用内存检查工具

野指针

  • 定义

    指向已释放或未分配的内存空间的指针

  • 产生原因

    • 使用已释放的指针
    • 未初始化
    • 指向超出内存空间的范围
  • 后果

    导致未定义的行为,严重甚至会造成内存数据被破坏或程序崩溃

  • 解决方案

    • 确保初始化
    • 不再使用时将其置为NULL/nullptr

智能指针我理解就是在对象生命周期自动管理内存的分配和释放,所以原理和上述各方案是关联的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值