news 2026/8/1 4:06:09

Valgrind快速使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Valgrind快速使用

1.Valgrind 的核心组件(工具集)

  • 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

参数:

  • – show-leak-kinds=all 显示 4 种泄漏类型:
    • definitely lost:明确泄漏(必须修复)
    • indirectly lost:间接泄漏(如容器内对象泄漏)
    • possibly lost:可能泄漏(需确认)
    • still reachable:内存未释放但可访问(如全局对象,可忽略)

几个例子快速熟悉使用:

1.new/new[] 与 delete/delete[]

new没有delete

#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 可获取具体行号

new[] 而后 delete

void test2(){ int *arr = new int[10]; /* ... ... */ delete arr; }
valgrind --leak-check=full --show-leak-kinds=all --log-file=v_2 ./test2

容器使用不当

void 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 ./test3

类设计缺陷:

成员指针未释放

浅拷贝导致两次释放
class MyClass{ public: MyClass(){ buffer = new char[1024]; } ~MyClass(){ delete[] buffer; } private: char *buffer ; }; void test5(){ MyClass obj1; MyClass obj2 = obj1 ; }

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/2 1:00:22

零基础掌握AI:实战机器学习全流程

个人首页&#xff1a; 永远都不秃头的程序员(互关) C语言专栏:从零开始学习C语言 C专栏:C的学习之路 本文章所属专栏&#xff1a;人工智能从 0 到 1&#xff1a;普通人也能上手的实战指南 目录 引言 引言 一、机器学习基础概念与工作流程 1.1 机器学习定义与分类 1.2…

作者头像 李华
网站建设 2026/8/1 0:46:10

java_base_面向对象原理省流

每日一学&#xff1a;基础知识精讲ok&#xff0c;终于也是要写完了&#xff0c;真是令人激动。话不多说有请今天的主角——封装&#xff08;Encapsulation&#xff09;&#xff0c;依然用邮轮运输的场景讲透核心逻辑。封装的核心&#xff1a;“打包 控权”其本质可以总结两个方…

作者头像 李华
网站建设 2026/8/1 9:13:41

Git 开发常用命令速查手册

文章目录git命令开发最常用的核心命令一、基础配置&#xff08;首次使用必做&#xff09;二、仓库初始化和克隆1. 本地新建仓库2. 克隆远程仓库三、工作区或暂存区操作1. 查看状态&#xff08;最常用&#xff01;随时确认文件变更&#xff09;2. 添加文件到暂存区&#xff08;提…

作者头像 李华
网站建设 2026/8/1 0:43:22

如快(sofast)

链接&#xff1a;https://pan.quark.cn/s/06a8b6a75c81如快Sofast是一款致力于提升办公效率的启动器工具&#xff0c;通过简洁易用的操作界面和强大的功能&#xff0c;帮助用户快速访问应用程序和文件&#xff0c;提高工作效率。该工具支持中文拼音模糊搜索&#xff0c;方便用户…

作者头像 李华
网站建设 2026/8/1 1:00:00

Java EE 应用与 Spring MVC简介

什么是JavaEE&#xff08;j2ee&#xff09;&#xff1f;javaee是一套用于开发大型企业级应用的标准和规范。它定义了组件模型和各种API。JavaEE的分层模型JavaEE通常采用多层架构&#xff0c;将应用的关注点清晰地分离&#xff0c;我们这里介绍的层级划分为&#xff1a;Domain …

作者头像 李华