0Pricing
C++ Academy · 课时

Valgrind 基础

检测泄漏和错误

Valgrind 基础 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。

Valgrind 是什么

Valgrind 是一个插桩框架。它的默认工具 Memcheck 可以通过在模拟 CPU 上运行程序,在无需重新编译的情况下检测内存泄漏和错误。

运行 Memcheck

使用 Valgrind 启动程序。请先使用 -g 进行构建,以便获得代码行号。

g++ -g main.cpp -o app
valgrind --leak-check=full ./app

检测内存泄漏

Memcheck 会报告程序退出时仍处于分配状态的内存,并将其分类为确定丢失、间接丢失或仍可访问。

#include <cstdlib>

int main() {
    int* p = (int*)malloc(40); // never freed -> definitely lost
    return 0;
}

泄漏类别

请了解报告中的类别。

  • 确定丢失:不再存在任何指针;是真正的内存泄漏
  • 间接丢失:只能通过一个已丢失的内存块访问
  • 仍可访问:退出时仍存在指针(通常无害)

无效读写

Memcheck 会标记对未分配或已释放内存的访问,并报告地址和大小。

#include <cstdlib>

int main() {
    int* a = (int*)malloc(2 * sizeof(int));
    a[5] = 1; // invalid write past the block
    free(a);
    return 0;
}

未初始化值

当条件判断或输出取决于未初始化值时,Memcheck 会发出警告;这是产生非确定性错误的常见原因。

#include <iostream>

int main() {
    int x;            // uninitialized
    if (x == 42)      // use of uninitialized value
        std::cout << "hi\n";
    return 0;
}

阅读输出

每个错误块都会显示操作、违规访问的调用栈,以及(对于堆内存块)内存的分配位置。HEAP SUMMARY 会汇总分配和内存泄漏。

实用选项

常用选项:

  • --leak-check=full:详细列出每个泄漏
  • --show-leak-kinds=all
  • --track-origins=yes:追踪未初始化值的来源
  • --error-exitcode=1:在出现错误时让持续集成失败

Valgrind 与 ASan

两者都能发现内存错误,但各有取舍。

  • Valgrind:无需重新编译,速度较慢(10 到 50 倍),对未初始化读取的检测更好
  • ASan:需要重新编译,但速度快得多,对栈溢出的检测更好

抑制已知问题

第三方库可能会产生干扰信息。使用 --gen-suppressions=all 和 --suppressions=file 生成并应用抑制文件,以忽略已知的无害报告。

何时使用 Valgrind

当您无法使用检测器重新编译、需要精确追踪未初始化值,或希望进行交叉验证时,可以使用 Valgrind。除此之外,ASan 通常更适合日常持续集成,因为它速度更快。

快速检查

回忆内存泄漏的类别。

回顾

您学会了 Valgrind 的基础知识。

  • Memcheck 可以发现内存泄漏、无效访问和未初始化读取,且无需重新编译
  • 使用 --leak-check=full --track-origins=yes 运行
  • 泄漏类型:确定丢失、间接丢失、仍可访问
  • 速度比 ASan 慢,但非常适合发现未初始化值错误

常见问题解答

「Valgrind 基础」课时是免费的吗?

是的 — 「Valgrind 基础」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。

「Valgrind 基础」这节课中我会学到什么?

检测泄漏和错误 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C++ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「Valgrind 基础」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C++ Academy 课中编写并运行代码吗?

能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 gdb 和 lldb
  2. AddressSanitizer
  3. UBSan 与 TSan
  4. Valgrind 基础
← 返回 C++ Academy