当前位置:首页 > 内存 > 正文

代码内存泄漏(容器内存泄漏)

  • 内存
  • 2024-08-14 04:12:35
  • 1937

一、内存泄露一般分为几种情况1、经常记忆力减退。内存泄漏的代码会运行多次,每次运行都会导致内存泄漏。
2.零星的内存泄漏。导致内存泄漏的代码只会在某些情况或操作下发生。频繁和偶发是相对的。在某些情况下,偶尔发生的事情可能会变得普遍。因此,测试环境和方法对于检测内存泄漏至关重要。
3.一次性内存泄漏。导致内存泄漏的代码只会执行一次,或者由于算法缺陷,只会有一个泄漏的内存块。例如,内存在Singleton类的构造函数中分配,但在析构函数中不会释放。Singleton类只有一个实例,因此内存泄漏只会发生一次。
4.内隐记忆丧失。程序在运行时不断分配内存,但直到结束才释放。严格来说,这里不会发生内存泄漏,因为程序最终会释放所有请求的内存。但对于必须运行数天、数周甚至数月的服务器程序来说,未能及时释放内存也会导致最终耗尽系统中的所有内存。因此,我们把这种类型的记忆丧失称为隐性记忆丧失。


二、内存泄露,内存越界和栈溢出的区别和联内存过剩(outofmemory)是指当程序申请内存时,没有足够的内存空间可以使用。
内存泄漏(memorleak)
是指申请内存后,系统无法释放所申请的内存空间并获得有用的内存。
注意:内存泄漏最终会导致内存溢出
简单理解,内存溢出就是需要分配的内存超过了系统提供的内存。内存泄漏是指系统必须分配内存供使用(新建),但使用后不归还(删除),从而占用内存效率。
内存泄漏可分为4种类型:
1.流程
2.开发生命周期是必要的。
3.一次性内存泄漏
代码只会执行一次,但内存总会泄漏。
4.久而久之我们也会给记忆带来疲劳。
综上所述,一次性内存泄漏不会对用户维护程序造成任何实质性损失,但在现实生活中,我们还是尽量避免。
内存越界
是指在应用到内存系统时,超出了使用时的应用范围。例如一些内存函数:sprintf、strcpy、strcat、vsprintf、memcpy、memset、memmove。当内存溢出的代码运行时,错误是必然的,并且通常会导致
1。
3.块删除了空闲内存
补充:如果你的程序之前运行正常,但是因为你添加了不同类型的变量或者修改了某些成员的部分代码(前提是要确保你(前提是)这些修改完全正确))如果程序出错,请考虑内存是否损坏,并检查内存是否越界。
缓冲区溢出(鹿溢出)
为了一次访问数据,程序通常会分配一定的内存区域,称为缓冲区。如果写入缓冲区的数据无法容纳在缓冲区内,则可以将存储单元写入到缓冲区之外,这称为缓冲区溢出。堆栈溢出是缓冲区溢出的一种,原理是一样的。分为上溢和下溢。其中,溢出是指栈已满,又有新的数据加入其中,导致数据溢出;溢出是指栈为空,进行删除操作等。