C++ 内存泄漏与溢出

本文详细介绍了内存泄露和内存溢出的概念,包括它们的成因、常见场景及检测方法。内存泄露可能导致内存溢出,通过良好的编程规范、智能指针和内存管理工具可以有效避免。此外,文章还提到了内存泄露检测的多种工具和技术,如手动检测、静态代码分析和动态运行检测。
摘要由CSDN通过智能技术生成

内存溢出
内存溢出(out of memory),是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory错误;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。

而内存溢出的一大原因就是因为内存泄露。

内存泄露
内存泄露(memory leak),是指程序在申请内存后,无法释放已申请的内存空间。

内存泄露我们通常关注两类情况:

  1. 堆内存泄漏 (Heap leak):堆内存指的是程序运行中根据需要通过malloc,realloc new等从堆中分配的一块内存,再是完成后必须通过调用对应的 free或者delete删掉。如果程序的设计的错误导致这部分内存没有被释放,那么此后这块内存将不会被使用,就会产生Heap Leak.。
  2. 系统资源泄露(Resource Leak):主要指程序使用系统分配的资源比如 Bitmap,handle,SOCKET等没有使用相应的函数释放掉,导致系统资源的浪费,严重可导致系统效能降低,系统运行不稳定。

内存泄露的场景

  1. malloc/free或者new/delete未成对出现 通过局部分配的内存
  2. 未在调用者函数体内释放
  3. 没有将基类的析构函数定义为虚函数,当基类的指针指向子类时,delete该对象时,不会调用子类的析构函数 没有正确地清除嵌套的对象指针
  4. 由于程序运行时出现不可遇见的错误,导致内存泄漏

内存泄露的检测方法

  • 手动检测
    为了避免内存泄露,在开发时采用良好的一致的编程规范。在代码完成时可以手动检测代码是否出现可能发生内存泄露的典型场景,是否符合编码规范。

  • 静态代码分析工具
    使用静态代码分析工具,比如 splint, PC-LINT, BEAM 等对代码进行分析。

  • 动态运行检测
    使用实时检测工具,如 valgrind, Rational purify 等对代码进行分析。

如何避免内存泄露

  1. 使用智能指针
  2. 遵循合理可靠的编码规范
  3. 尽量少用静态变量
  4. 使用Arena
    Arena是一种统一化管理内存生命周期的方法。所有需要在堆上分配的内存,不通过 malloc/new,而是通过 Arena 的 CreateObject 接口。同时,不需要手动的执行 free/delete,而是在 Arena 被销毁的时候,统一释放所有通过 Arena 对象申请的内存。所以,只需要确保 Arena 对象一定被销毁就可以了,而不用再关心其他对象是否有漏掉的 free/delete。
    使用协程

内存泄露和内存溢出的关系

  1. 相同点:都会导致应用程序运行出现问题,性能下降或挂起。
  2. 不同点:内存泄露是导致内存溢出的原因之一,内存泄露积累起来将导致内存溢出;内存泄露可以通过完善代码来避免,内存溢出可以通过调整配置来减少发生频率,但无法彻底避免。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值