• C++内存机制中内存溢出、内存泄露、内存越界和栈溢出的区别和联系


      当我们在用C++做底层驱动的时候,经常会遇到内存不足的警告,究其原因,往往是因为内存出现溢出,泄露或者越界等原因。那么他们之间有什么联系吗?
      内存溢出(out of memory)

    是指程序在申请内存时,没有足够的内存空间供其使用。
      内存泄漏(memory leak)

    是指程序在申请内存后,无法释放已申请的内存空间,占用有用内存。
     注:内存泄漏最终会导致内存溢出

    简单理解,内存溢出就是要求分配的内存超出了系统所给的。内存泄漏是指向系统申请分配内存进行使用(new),但是用完后不归还(delete),导致占用有效内存。

    内存泄漏可分为4类:

    1.常发性内存泄漏

     引起内存泄漏的代码会被很多次执行,每次执行的时候都会导致内存泄漏

    2.偶发性内存泄漏

    在某些特定的环境下执行引起内存泄漏的代码,才会引起内存泄漏

    从以上两种内存泄漏的方式来看,测试环境和测试方法在程序生命周期的重要性是不可或缺的。

    3.一次性内存泄漏

    代码只会执行一次,但总有一块内存发生泄漏,多见于构造类的时候,析构函数没有释放内存。

    4.隐式泄漏

    程序运行过程中不断的分配内存,直到结束时才释放内存,但一般服务器程序会运行较长的时间,不及时释放也会导致内存耗尽以至于内存泄漏。

    综上所述,一次性内存泄漏对用户的程序维护是没有什么实质性的伤害,但在实际生活中,我们还是尽可能要避免此类的事件发生。
    内存越界
    是指向系统申请一块内存后,使用时却超出申请范围。比如一些操作内存的函数:sprintf、strcpy、strcat、vsprintf、memcpy、memset、memmove。当造成内存泄漏的代码运行时,所带来的错误是无法避免的,通常会造成
    1.破坏了堆中内存内存分配信息数据
    2.破坏了程序其他对象的内存空间
    3.破坏了空闲内存块
    附:如果在之前你的程序运行一切正常,但因为你新增了几个类的成员变量或者修改了一部分代码(前提是保证你的这些修改是完全正确的)而导致程序发生错误,则因考虑是否是内存被破坏的原因了,重点排查内存是否越界。
    缓冲区溢出(栈溢出)
    程序为了临时存取数据的需要,一般会分配一些内存空间称为缓冲区。如果向缓冲区中写入缓冲区无法容纳的数据,机会造成缓冲区以外的存储单元被改写,称为缓冲区溢出。而栈溢出是缓冲区溢出的一种,原理也是相同的。分为上溢出和下溢出。其中,上溢出是指栈满而又向其增加新的数据,导致数据溢出;下溢出是指空栈而又进行删除操作等,导致空间溢出。
    ---------------------

  • 相关阅读:
    zabbix邮箱告警配置
    kali linux 开启配置ssh服务
    自主访问控制和强制访问控制
    Eddy's picture
    Connect the Cities--hdoj
    Dark roads--hdoj
    Ice_cream’s world III
    国王的烦恼---nyoj
    Tree
    Jungle Roads --hdoj
  • 原文地址:https://www.cnblogs.com/zhoug2020/p/10520428.html
Copyright © 2020-2023  润新知