当咱们在用C++作底层驱动的时候,常常会遇到内存不足的警告,究其缘由,每每是由于内存出现溢出,泄露或者越界等缘由。那么他们之间有什么联系吗?
内存溢出(out of memory)
是指程序在申请内存时,没有足够的内存空间供其使用。
内存泄漏(memory leak)
是指程序在申请内存后,没法释放已申请的内存空间,占用有用内存。
注:内存泄漏最终会致使内存溢出
简单理解,内存溢出就是要求分配的内存超出了系统所给的。内存泄漏是指向系统申请分配内存进行使用(new),可是用完后不归还(delete),致使占用有效内存。
内存泄漏可分为4类:
1.常发性内存泄漏
引发内存泄漏的代码会被不少次执行,每次执行的时候都会致使内存泄漏
2.偶发性内存泄漏
在某些特定的环境下执行引发内存泄漏的代码,才会引发内存泄漏
从以上两种内存泄漏的方式来看,测试环境和测试方法在程序生命周期的重要性是不可或缺的。
3.一次性内存泄漏
代码只会执行一次,但总有一块内存发生泄漏,多见于构造类的时候,析构函数没有释放内存。
4.隐式泄漏
程序运行过程当中不断的分配内存,直到结束时才释放内存,但通常服务器程序会运行较长的时间,不及时释放也会致使内存耗尽以致于内存泄漏。
综上所述,一次性内存泄漏对用户的程序维护是没有什么实质性的伤害,但在实际生活中,咱们仍是尽量要避免此类的事件发生。
内存越界
是指向系统申请一块内存后,使用时却超出申请范围。好比一些操做内存的函数:sprintf、strcpy、strcat、vsprintf、memcpy、memset、memmove。当形成内存泄漏的代码运行时,所带来的错误是没法避免的,一般会形成
1.破坏了堆中内存内存分配信息数据
2.破坏了程序其余对象的内存空间
3.破坏了空闲内存块
附:若是在以前你的程序运行一切正常,但由于你新增了几个类的成员变量或者修改了一部分代码(前提是保证你的这些修改是彻底正确的)而致使程序发生错误,则因考虑是不是内存被破坏的缘由了,重点排查内存是否越界。
缓冲区溢出(栈溢出)
程序为了临时存取数据的须要,通常会分配一些内存空间称为缓冲区。若是向缓冲区中写入缓冲区没法容纳的数据,机会形成缓冲区之外的存储单元被改写,称为缓冲区溢出。而栈溢出是缓冲区溢出的一种,原理也是相同的。分为上溢出和下溢出。其中,上溢出是指栈满而又向其增长新的数据,致使数据溢出;下溢出是指空栈而又进行删除操做等,致使空间溢出。
---------------------
服务器