ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Dev‑C++ 内存泄漏检测

Dev‑C++ 内存泄漏检测 文章目录方案1AddressSanitizerASan推荐直接Dev-C编译1. Dev-C编译器设置测试泄漏示例代码方案2Dr.MemoryWindows独立内存检测工具兼容所有Dev-C程序方案3简易手动检测不装额外工具适合学生作业方案1AddressSanitizerASan推荐直接Dev-C编译ASan是GCC自带内存检测器能检测内存泄漏、野指针、越界访问、use-after-free直接输出泄漏的文件名行号。1. Dev-C编译器设置工具 → 编译选项 → 勾选【在编译器命令行加入以下命令】填入-g -O0 -fsanitizeaddress-g调试符号-O0关闭优化-fsanitizeaddress开启内存检测如果有多线程加上-pthread-g -O0 -fsanitizeaddress -pthread代码生成/优化 → 连接器产生调试信息Yes全部重新编译Rebuild然后直接运行程序。测试泄漏示例代码#includeiostreamusingnamespacestd;voidtest_leak(){int*pnewint[100];// 只申请没有delete内存泄漏}intmain(){test_leak();return0;}运行后控制台会自动打印泄漏堆栈直接定位到new所在行。注意Embarcadero Dev-C新版TDM-GCC9.2才完整支持ASan老Orwell5.11自带gcc版本低ASan支持很差。方案2Dr.MemoryWindows独立内存检测工具兼容所有Dev-C程序适合旧版Dev-COrwell5.11gcc版本低不支持ASan下载Dr.MemoryWindows内存检测工具Dev-C编译程序编译参数-g -O0生成exe打开cmd进入exe目录执行drmemory -- ./test.exe运行结束输出完整报告泄漏大小、分配代码行号、越界访问等。优点不依赖编译器版本缺点运行速度慢。方案3简易手动检测不装额外工具适合学生作业重载new/delete统计分配次数程序结束打印是否有未释放内存。缺点只能检测new/delete不能定位行号无法检测malloc。#includeiostreamusingnamespacestd;intg_cnt0;void*operatornew(size_t size){g_cnt;returnmalloc(size);}voidoperatordelete(void*p)noexcept{g_cnt--;free(p);}intmain(){int*pnewint;// delete p; // 注释掉就会泄漏if(g_cnt!0)cout内存泄漏剩余分配块数g_cntendl;return0;}
返回列表