0Pricing
C++ Academy · Урок

Основы Valgrind

Обнаруживайте утечки и ошибки

«Основы Valgrind» — бесплатный урок C++ Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения 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: считать CI неуспешным при наличии ошибок

Valgrind и ASan

Оба инструмента находят ошибки памяти, но у каждого есть свои особенности.

  • Valgrind: повторная компиляция не нужна, работает медленнее (в 10–50 раз), хорошо обнаруживает неинициализированное чтение
  • ASan: требует повторной компиляции, работает гораздо быстрее, лучше обнаруживает переполнение стека

Подавление известных проблем

Сторонние библиотеки могут создавать лишний шум. Создайте и примените файл подавления с помощью --gen-suppressions=all и --suppressions=file, чтобы скрыть известные безопасные сообщения.

Когда использовать Valgrind

Используйте Valgrind, если нельзя повторно скомпилировать программу с санитайзерами, нужно точно отслеживать неинициализированные значения или требуется дополнительная проверка. В остальных случаях ASan обычно быстрее подходит для повседневного использования в CI.

Быстрая проверка

Вспомните категории утечек.

Повторение

Вы изучили основы Valgrind.

  • Memcheck находит утечки, недопустимые обращения и неинициализированное чтение без повторной компиляции
  • Запускайте его с параметрами --leak-check=full --track-origins=yes
  • Виды утечек: определённо или косвенно потерянная память, всё ещё достижимая память
  • Работает медленнее ASan, но отлично подходит для поиска ошибок с неинициализированными значениями

Часто задаваемые вопросы

Урок «Основы Valgrind» бесплатный?

Да — полный текст урока «Основы Valgrind» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Основы Valgrind»?

Обнаруживайте утечки и ошибки Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Основы Valgrind»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Использование gdb и lldb
  2. AddressSanitizer
  3. UBSan и TSan
  4. Основы Valgrind
← Назад к C++ Academy