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

ios内存泄漏和内存溢出(内存泄漏与内存溢出)

  • 内存
  • 2024-06-30 12:53:01
  • 1502

一、简单说一说内存泄漏、内存溢出、内存碎片。用户在内存中使用的内存位置分为三个:
程序存储空间、
静态存储空间、
动态存储空间。
程序数据一般存储在静态存储位置和动态存储位置。
静态存储位置是程序启动时分配的永久内存位置。
变量存储位置一般是在程序执行过程中根据需要动态分配和释放的内存位置。该内存空间在使用后需要开发者释放。无法使用相应的环境。
举个例子:-有一个空杯子,可以装50ml的水,但是你要往毯子里倒100ml的水,那么此时多余的水肯定会流出来。所以在内存方面,内存溢出了。
内存碎片分为外部碎片和内部碎片
外部碎片是指尚未分配(不在任何进程中)但很小的内存空间。为相关新进程分配可用内存空间。
外部分区是任何分配的空间或页面之外的空闲存储块。这些存储块的总和可以满足当前应用程序的长度要求,但由于已弃用的地址或其他原因,系统无法适应当前应用程序。
内部中断是已分配的空间(可以清楚地表明它属于哪个进程)但不能使用,
内部中断是内部的或页存储中的。拥有这些区域或页面的进程不使用该存储块。当进程持有该存储块时,系统无法使用它。在进程被释放或进程终止之前,系统可能不会使用该内存块。
二、内存泄露,内存越界和栈溢出的区别和联内存溢出(内存不足)是指当程序请求内存时,没有足够的内存空间可供其使用。
内存泄漏
是指程序一旦申请内存,无法释放所申请的内存空间,占用了可用内存。
注意:内存泄漏最终会导致内存溢出。
简单理解,内存溢出就是指要分配的内存超过了系统提供的内存。内存泄漏是指系统请求分配内存供使用(新建),但使用后不归还(删除),造成有效内存占用。
内存泄漏可分为4类:
1.频繁内存泄漏
导致内存泄漏的代码会被多次执行,每次执行都会导致内存泄漏。泄漏
2.偶尔发生内存泄漏
在某些特定环境下执行内存泄漏代码会导致内存泄漏
在上述两种内存泄漏方式中,测试环境和方法测试程序生命周期的重要性至关重要。
3.单一内存泄漏
代码只会行一次,但总会出现内存泄漏,这种情况在构造类时比较常见,而且析构函数不会释放内存。
4.隐式泄漏
在程序执行过程中不断分配内存,并且仅在程序结束时释放内存。然而,服务器程序通常会运行很长时间而无法释放它们。随着时间的推移这也会导致内存耗尽。
综上所述,一次性内存泄漏不会对用户程序的维护造成实质性损害,但在现实生活中我们应该尽量避免此类事件的发生。
内存超出范围
是指向系统请求一块内存后,使用时超出了申请范围。例如,一些对内存进行操作的函数:sprintf、strcpy、strcat、vsprintf、memcpy、memset、memmove。当导致内存泄漏的代码执行时,引起的错误是不可避免的,通常会导致
1.销毁堆中的内存分配信息数据
2.销毁太空程序中其他对象的内存。
3.破坏空闲内存块
附:如果你的程序之前运行正常,但是因为你添加了几个新的类成员变量或者改变了部分代码(原则是要确保你(这些改变是完全没问题的)))如果程序出错,判断内存是否损坏,重点检查内存是否超出范围。
缓冲区溢出(堆栈溢出)
为了临时访问数据,程序通常会分配称为缓冲区的内存空间。如果缓冲区无法容纳的数据被写入缓冲区,则可能会导致缓冲区外部的存储单元被覆盖,称为缓冲区溢出。堆栈溢出是缓冲区溢出的一种,原理是一样的。分为上溢和下溢。其中,溢出是指栈已满,又有新的数据加入其中,导致数据溢出;下溢是指栈为空,执行删除操作等,造成空间溢出。