zoukankan      html  css  js  c++  java
  • C++内存机制中内存溢出、内存泄露、内存越界和栈溢出的区别和联系

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

     内存溢出(out of memory)

    是指程序在申请内存时,没有足够的内存空间供其使用。

    内存泄漏(memory leak)

    是指程序在申请内存后,无法释放已申请的内存空间,占用有用内存。

    注:内存泄漏最终会导致内存溢出

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

    内存泄漏可分为4类:

    1.常发性内存泄漏 

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

    2.偶发性内存泄漏

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

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

    3.一次性内存泄漏

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

    4.隐式泄漏

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

    综上所述,一次性内存泄漏对用户的程序维护是没有什么实质性的伤害,但在实际生活中,我们还是尽可能要避免此类的事件发生。

    内存越界

    是指向系统申请一块内存后,使用时却超出申请范围。比如一些操作内存的函数:sprintf、strcpy、strcat、vsprintf、memcpy、memset、memmove。当造成内存泄漏的代码运行时,所带来的错误是无法避免的,通常会造成
    1.破坏了堆中内存内存分配信息数据
    2.破坏了程序其他对象的内存空间
    3.破坏了空闲内存块

    附:如果在之前你的程序运行一切正常,但因为你新增了几个类的成员变量或者修改了一部分代码(前提是保证你的这些修改是完全正确的)而导致程序发生错误,则因考虑是否是内存被破坏的原因了,重点排查内存是否越界。

    缓冲区溢出(栈溢出)

    程序为了临时存取数据的需要,一般会分配一些内存空间称为缓冲区。如果向缓冲区中写入缓冲区无法容纳的数据,机会造成缓冲区以外的存储单元被改写,称为缓冲区溢出。而栈溢出是缓冲区溢出的一种,原理也是相同的。分为上溢出和下溢出。其中,上溢出是指栈满而又向其增加新的数据,导致数据溢出;下溢出是指空栈而又进行删除操作等,导致空间溢出。
  • 相关阅读:
    ASP.NET Core 3.0 迁移避坑指南
    Go初学乍练
    IdentityServer4 常见问题
    ASP.NET Core 奇淫技巧之动态WebApi
    Visual Studio 2019 16.1 使用 .NET Core 3.0
    【Java】maven多项目资源共享
    【Web】Web开发中的异常处理方案
    【UML】Java代码与UML模型相互转换方法
    【Spark】为什么没有任务调度到新增的Worker之上???
    【网络】高性能网络编程--下一个10年,是时候考虑C10M并发问题了
  • 原文地址:https://www.cnblogs.com/ktao/p/7570717.html
Copyright © 2011-2022 走看看