malloc / free 和 new / delete 共同点:都是从堆上申请空间,并且需要用户手动释放。
不同点如下:(围绕着用法上的区别底层的区别)
① malloc / free 是函数,而 new / delete 是操作符。
② malloc 申请的空间不会初始化,new 可以初始化。
③ malloc 申请空间时,需要手动计算空间的大小并传递,new 只需在其后跟上空间的类型即可。
④ malloc 的返回值为 void* ,因此在使用时必须强制类型转换,而 new 不需要,因为 new 后面跟的是空间的类型。
⑤ malloc 申请空间失败时,返回的是 NULL,因此使用时出于安全角度需要对其进行判空处理。而 new 不需要,但是 new 需要捕获异常。
⑥ 申请自定义类型对象时,malloc / free 只会开空间和清理空间。而 new 申请空间后会调用构造函数完成对象的初始化,delete 在释放空间前会调用析构函数完成空间中资源的清理。
什么是内存泄露 —— 动态申请的内存,不使用了,有没有主动释放,就存在内存泄露。
内存泄露的危害 ——
a. 出现内存泄露的进程正常结束,进程结束时这些内存会还给系统,不会有什么大的伤害。
b. 出现内存泄露的进程的非正常结束,比如僵尸进程。
c. 需要长期运行的程序,出现内存泄露。危害很大,系统会越来越慢,甚至卡死宕机。
(服务器程序、后台程序)
内存泄露:内存泄露是指因为疏忽或者错误造成程序未能释放已经不再实用的内存的情况。内存泄露并不是只内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
危害:长期运行的程序出现内存泄露,影响很大。如操作系统、后台服务器等,出现内存泄露会导致相应越来越慢,最终卡死。
void MemoryLeaks() {
// 1.内存申请了忘记释放
int* p1 = (int*)malloc(sizeof(int));
int* p2 = new int;
// 2.异常安全问题
int* p3 = new int[10];
Func(); // 这里Func函数抛异常导致 delete[] p3未执行,p3没被释放。
delete[] p3;
}
C / C++ 程序中,我们一般关心两种方面的内存泄露:
堆内存泄露(Heap Leak)
堆内存指的是程序执行中语句须分配通过 malloc / calloc / realloc / new 等从堆中分配的一块内存,用完后必须通过调用相应的 free 或者 delete 删掉。假设程序的设计错误导致这部分内存没有释放,那么以后这部分空间将无法再被实用,就会产生 Heap Leak。
系统资源泄露
之程序使用系统分配资源,比如套接字(两个网络各自通信连接中的端点)、文件描述符、管道等没有使用对应的函数释放掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定。
Linux 下内存泄露检测Linux下几款C++程序中的内存泄露检查工具_CHENG Jian的博客-CSDN博客_内存溢出检测工具Linux下编写C或者C++程序,有很多工具,但是主要编译器仍然是gcc和g++。最近用到STL中的List编程,为了检测写的代码是否会发现内存泄漏,了解了一下相关的知识。所有使用动态内存分配(dynamic memory allocation)的程序都有机会遇上内存泄露(memory leakage)问题,在Linux里有三种常用工具来检测内存泄露的情況https://blog.csdn.net/gatieme/article/details/51959654
在windows下使用第三方工具
VS编程内存泄漏:VLD(Visual LeakDetector)内存泄露库_波波在学习的博客-CSDN博客背景: 这几日在学习一位朋友的LoggerTest日志编程时,碰到内存泄漏问题,由于VS自带的内存邪路检查不好用,因此出现内存问题时比较头疼,很难找到根源。经过一番搜索,得到一个内存泄漏工具:VLD(Visual LeakDetector)内存泄露库。https://blog.csdn.net/GZrhaunt/article/details/56839765
其他工具
内存泄露检测工具比较 - 默默淡然 - 博客园1.ccmalloc-Linux和Solaris下对C和C++程序的简单的使用内存泄漏和malloc调试库。2.Dmalloc-Debug Malloc Library.3.Electric Fenchttps://www.cnblogs.com/liangxiaofeng/p/4318499.html
① 工程前期良好的设计规范,养成良好的编码规范,申请的内存空间记着匹配地去释放。(ps:这个是理想状态,但是如果碰上异常时,就算注意释放了,还是可能会出现问题,需要下一条智能指针来管理才有保证)。
② 采用 RAII 思想(资源获取即初始思想)或者智能指针来管理资源。
③ 有些公司内部规范使用内部实现的私有内存管理库。这套库自带内存泄漏检测的功能选项。
④ 出问题了使用内存泄露工具检测(ps:不过很多工具不够靠谱,或者收费昂贵)。
总结:内存泄露非常常见,解决方案分为两种:
① 提前预防型:如智能指针等。
② 事后查错型:如泄露检测工具。