Основы 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 — локальная установка не требуется.
Все уроки этого курса
- Использование gdb и lldb
- AddressSanitizer
- UBSan и TSan
- Основы Valgrind