内存泄漏
一般指堆的内存泄漏,简单来说就是已申请的内存空间没有被正确释放。
避免内存泄露的几种方式
- 计数法:使用new或者malloc时,让该数+1,delete或free时,该数-1,程序执行完打印这个计数,如果不为0则表示存在内存泄露
- 一定要将基类的析构函数声明为虚函数
- 对象数组的释放一定要用delete []
- 有new就有delete,有malloc就有free,保证它们一定成对出现
检测工具
- Linux下可以使用Valgrind工具
- Windows下可以使用CRT库
在 Linux 或 macOS 下,有多种工具可以用来检测内存泄漏。以下是一些常用的方法:
- mtrace:mtrace 是 GNU Glibc 自带的内存问题检测工具,它可以用来协助定位内存泄露问题。mtrace 的基本设计原理为设计一个函数
void mtrace()
,函数对 libc 库中的malloc/free
等函数的调用进行追踪,由此来检测内存是否存在泄漏的情况。使用 mtrace 时,需要在代码中包含<mcheck.h>
,并在程序开始时调用mtrace()
,在程序结束时调用muntrace()
。同时,需要设置环境变量MALLOC_TRACE
来指定日志文件的路径。
#include <mcheck.h>
#include <stdlib.h>
int main() {
mtrace(); // 开始跟踪
char *p = (char *)malloc(100);
free(p);
p = NULL;
p = (char *)malloc(100);
muntrace(); // 结束跟踪,并生成日志信息
return 0;
}
-
Valgrind1:Valgrind 是一套开源的仿真调试工具集合,其中的 Memcheck 工具可以用来检测程序中出现的内存问题,包括内存泄漏。使用 Valgrind 进行内存泄漏检测时,只需要在命令行中使用
valgrind --leak-check=yes your_program
命令运行你的程序即可。 -
ps 命令2:在 Linux 平台,可以使用 ps 命令来监视内存的使用,观测指定进程的 VSZ 值,从而发现可能的内存泄漏。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)