什么是内存泄漏?
内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
简单说就是申请了一块内存,在使用完后没有释放掉,也就是忘记归还空间。致这块内存一直存在却没有指针指向这块内存,那么这块内存就泄露了。内存泄漏(较多时)表现在程序运行慢,程序出现卡顿甚至崩溃。
内存泄漏的危害
长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。
内存泄漏分类
1. 堆内存泄漏(Heap leak)
堆内存指的是程序执行中依据须要分配通过malloc / calloc / realloc / new等从堆中分配的一块内存,用完后必须通过调用相应的 free或者delete 删掉。假设程序的设计错误导致这部分内存没有被释放,那么以后这部分空间将无法再被使用,就会产生Heap Leak。
动态内存管理(c/c++)
C/C++ 中申请释放空间时必须匹配起来使用maloc/free,new/delete,new[]/delete[],若不匹配,可能会引起内存泄漏,代码崩溃(对内置类型没有影响)
C: malloc/calloc/realloc(函数) (free)
相同点:
- 在堆上申请空间
- 返回类型为void*,使用时返回类型需要进行强转
- 使用free释放空间
- 若成功,返回首地址;若失败,返回NULL-------->使用时需判空
区别:
- malloc:需要一个参数,申请空间的字节数
申请时会开辟额外空间(36字节),方便系统进行管理。如malloc(sizeof(int)*10)
- calloc:需要两个参数,申请空间个数(num)及size
- realloc:两个参数,需要修改的空间(void* p)及需要改为多大(size)
- free:释放空间
C++: new/new[](操作符) (delete/delete[]) - new/free:申请/释放单个元素空间
class:
new:调用构造函数
free:调用析构函数释放资源,清理空间 - new[]/free[]:申请/释放一段连续的空间
2. 系统资源泄漏
指程序使用系统分配的资源,比方套接字、文件描述符、管道等没有使用对应的函数释放掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定。(一般说的内存泄漏是堆内存泄漏)
解决方案
-
事前预防型。如智能指针等。
智能指针可以自动删除分配的内存。智能指针和普通指针类似,只是不需要手动释放指针,而是通过智能指针自己管理内存的释放。 -
事后查错型。如泄漏检测工具。
参考:https://blog.csdn.net/invisible_sky/article/details/78205576?utm_source=app