查内存泄漏的方法

1. 先查是否所有申请内存都释放,包括: 
new / new [] ----  delete / delete []  //注意一一对应 
malloc ----  free 
CoTaskMemAlloc ----  CoTaskMemFree 
SysAllocString ----  SysFreeString 
SafeArrayCreate ----  SafeArrayDestroy 
CreatePen/CreateBrush ----  DeleteObject 
GetDC ----  ReleaseDC 
ITypeInfo::GetTypeAttr()  ----  ITypeInfo::ReleaseTypeAttr() 
COleSteamFile::OpenStream, 
CreateStream, CreateMemoryStream  ----  COleStreamFile::Close() 

2. 使用performance察看内存在哪个时段增加后没有释放。在cmd中键入perfmon,就可以打开,至于怎么用上网自己查。 

3. 再就是使用一个类CMemorySate,来查看某段代码申请内存后是否释放。这个类很简单自己看看MSDN就能会用。

 

http://bbs.youkuaiyun.com/topics/310245629

在 Linux 系统中检测内存泄漏,通常需要结合工具和编程实践来定位问题。内存泄漏多发生在使用手动内存管理的语言中(如 C/C++),即程序分配了内存但未正确释放,导致长时间运行后内存占用不断上升。 以下是几种常用的 Linux 下检测内存泄漏方法和工具: --- ### ✅ 1. 使用 `valgrind` 检测内存泄漏(推荐) `valgrind` 是 Linux 下最强大的内存调试工具之一,可以检测内存泄漏、非法内存访问等问题。 #### 安装 valgrind(Ubuntu/Debian 示例): ```bash sudo apt install valgrind ``` #### 示例代码:存在内存泄漏的 C 程序 ```c // leak.c #include <stdlib.h> int main() { int *p = (int *)malloc(10 * sizeof(int)); // 忘记调用 free(p); return 0; } ``` #### 编译程序(带调试符号): ```bash gcc -g -o leak leak.c ``` #### 使用 valgrind 检测内存泄漏: ```bash valgrind --leak-check=full ./leak ``` #### 输出示例: ```bash ==12345== HEAP SUMMARY: ==12345== in use at exit: 40 bytes in 1 blocks ==12345== total heap usage: 1 allocs, 0 frees, 40 bytes allocated ==12345== ==12345== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==12345== at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) ==12345== by 0x1086C8: main (leak.c:5) ``` > 上述输出表明有 40 字节内存“definitely lost”,说明存在内存泄漏。 --- ### ✅ 2. 使用 `gdb` 配合调试定位泄漏点 虽然 `gdb` 本身不能自动检测内存泄漏,但可以配合断点、内存检查等手段辅助分析。 #### 示例:在关键位置设置断点看指针状态 ```bash gdb ./leak (gdb) break main (gdb) run (gdb) print p ``` 可用于跟踪指针是否被正确释放。 --- ### ✅ 3. 使用 `malloc_hook` 或自定义内存分配器(高级方法) 你可以通过替换 `malloc`/`free` 来记录所有内存分配与释放行为。 #### 示例:使用 `__malloc_hook` 记录分配(C语言) ```c // hook_malloc.c #include <stdio.h> #include <stdlib.h> #include <malloc.h> static void* (*old_malloc_hook)(size_t, const void*) = NULL; static void* my_malloc(size_t size, const void* caller) { void* ptr = malloc(size); printf("malloc(%zu) = %p\n", size, ptr); return ptr; } static void my_init(void) __attribute__((constructor)); static void my_init(void) { old_malloc_hook = __malloc_hook; __malloc_hook = my_malloc; } ``` 编译并运行: ```bash gcc -g -o hook hook_malloc.c -ldl ./hook ``` > 注意:这种方法较底层,适合开发调试库或中间件时使用。 --- ### ✅ 4. 使用 AddressSanitizer(现代高效方式) `AddressSanitizer`(ASan)是 GCC/Clang 内置的快速内存错误检测器,比 valgrind 更快。 #### 示例代码(同上 leak.c) #### 编译时启用 ASan: ```bash gcc -g -fsanitize=address -fno-omit-frame-pointer -o leak_asan leak.c ``` #### 运行程序: ```bash ./leak_asan ``` > 如果有内存泄漏,会输出类似: ```bash ==12345==ERROR: LeakSanitizer: detected memory leaks ``` > ASan 在程序退出时自动报告泄漏。 --- ### ✅ 5. 监控系统内存使用情况(初步判断) 使用系统命令观察进程内存增长趋势: ```bash # 看某个进程的内存使用(按 PID) watch -n 1 'cat /proc/<PID>/status | grep VmRSS' # 或者使用 top top -p <PID> ``` 如果 `VmRSS` 持续增长且不下降,可能是内存泄漏的迹象。 --- ### 总结对比 | 工具/方法 | 优点 | 缺点 | |------------------|------------------------------|-------------------------------| | valgrind | 功能强大,精确报告泄漏 | 运行慢,不适合生产环境 | | AddressSanitizer | 快速,集成在编译器中 | 需要重新编译,占用额外内存 | | gdb | 可深度调试 | 无法自动检测,依赖人工分析 | | 自定义 hook | 可定制日志 | 实现复杂,易出错 | | /proc/PID/status | 无需修改代码 | 只能判断趋势,不能定位具体点 | --- ### 推荐流程: 1. **开发阶段**:使用 `AddressSanitizer` 快速发现泄漏。 2. **调试阶段**:使用 `valgrind` 精确定位泄漏位置。 3. **部署监控**:通过 `top`/`ps` 观察长期运行服务的内存趋势。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值