从零到一复现FlowNet-C:用PyTorch手把手搭建你的第一个光流估计网络(附完整代码)
2026/5/26 4:03:23
memcheck 内存泄漏、内存错误检测(越界 / 野指针 / 双重释放)
cachegrind 缓存命中率,cpu性能分析
callgrind 函数调用关系、执行次数、耗时分析
helgrind 线程竞争、死锁检测
massif 堆内存使用趋势分析
其中mencheck是最常用的,也是本文讲解的
格式:
valgrind[通用参数]--tool=memcheck[memcheck参数]程序名[程序参数]基础命令:
valgrind --tool=memcheck\--leak-check=full\# 详细检测所有内存泄漏--show-leak-kinds=all\# 显示所有泄漏类型(确定/间接/可能)--track-origins=yes\# 定位内存越界/野指针的根源(精准但稍慢)--verbose\# 输出额外调试信息--log-file=valgrind.log\# 文本日志输出到文件--xml=yes\# 启用 XML 格式输出--xml-file=valgrind.xml\# XML 若使用xml日志输出到文件(必须补充!)./test# 待检测的程序(可加参数,如 ./test 123参数:
definitely lost:明确泄漏(必须修复)indirectly lost:间接泄漏(如容器内对象泄漏)possibly lost:可能泄漏(需确认)still reachable:内存未释放但可访问(如全局对象,可忽略)#include <iostream> #include <string> using namespace std; void test_basic_leak() { int* num = new int(100); // 分配堆内存 std::string* str = new std::string("test leak"); // 分配堆内存 { // 业务逻辑后直接返回,未释放指针 /* .... */ return ; } delete num; delete str; num = nullptr ; str = nullptr ; } int main(){ test_basic_leak(); return 0; }g++ -o test1 -g -O0 test.cc# -g 可获取具体行号void test2(){ int *arr = new int[10]; /* ... ... */ delete arr; }valgrind --leak-check=full --show-leak-kinds=all --log-file=v_2 ./test2void test3(){ vector<int*> arr(5) ; for(int i = 0 ; i < arr.size() ; ++i) { arr[i] = new int(i); } arr.clear(); }valgrind --leak-check=full --show-leak-kinds=all --log-file=v_3 ./test3class MyClass{ public: MyClass(){ buffer = new char[1024]; } ~MyClass(){ delete[] buffer; } private: char *buffer ; }; void test5(){ MyClass obj1; MyClass obj2 = obj1 ; }