Распространённые ошибки работы с памятью
Избегайте утечек и висячих указателей
«Распространённые ошибки работы с памятью» — бесплатный урок C++ Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Утечки памяти
Утечка памяти возникает, когда память в куче выделена, но никогда не освобождается. Программа продолжает потреблять память, к которой больше не может обратиться.
void leak() {
int* p = new int(5);
// missing delete p; -> leaked
}Висячие указатели
Висячий указатель указывает на уже освобождённую память. Разыменование такого указателя приводит к неопределённому поведению.
int* p = new int(7);
delete p;
// *p = 3; // BUG: dangling accessДвойное освобождение
Двойной вызов delete для одного указателя повреждает кучу и часто приводит к аварийному завершению программы.
int* p = new int(1);
delete p;
// delete p; // BUG: double freeОбращение после освобождения
Чтение или запись через указатель после удаления объекта — это обращение после освобождения, распространённый источник уязвимостей безопасности.
Переполнение буфера
Запись за концом массива перезаписывает несвязанную память. Всегда соблюдайте границы.
int a[3] = {1, 2, 3};
// a[3] = 99; // BUG: out of boundsНесоответствующее освобождение
Использование delete для памяти, выделенной с помощью new[] (или наоборот), приводит к неопределённому поведению. Всегда используйте соответствующие пары.
int* arr = new int[4];
// delete arr; // BUG: should be delete[] arr;
delete[] arr; // correctНеинициализированные указатели
Неинициализированный указатель содержит мусорное значение. Всегда инициализируйте его корректным адресом или значением nullptr.
#include <iostream>
int main() {
int* p = nullptr; // safe default
if (!p) std::cout << "not set\n";
}Возврат адресов локальных переменных
Возврат адреса локальной переменной в стеке мгновенно создаёт висячий указатель, поскольку локальная переменная уничтожается при возврате.
int* bad() {
int x = 10;
return &x; // BUG: x is gone
}Умные указатели предотвращают утечки
Замена необладающих владельцев на std::unique_ptr устраняет большинство утечек и случаев двойного освобождения: очистка выполняется автоматически и ровно один раз.
#include <iostream>
#include <memory>
int main() {
auto p = std::make_unique<int>(5);
std::cout << *p << "\n";
} // freed exactly once, automaticallyИнструменты для обнаружения ошибок
Такие инструменты, как AddressSanitizer и Valgrind, обнаруживают утечки, двойное освобождение и выход за границы во время выполнения. Включайте их в процесс тестирования.
Предотвращение лучше обнаружения
Лучшее решение — полностью избегать необладающего владения: используйте контейнеры, такие как std::vector, и умные указатели, чтобы библиотека правильно управляла памятью за Вас.
Быстрая проверка
Проверьте, насколько хорошо Вы поняли ошибки работы с памятью.
Итоги
Вы изучили классические ошибки работы с памятью: утечки, висячие указатели, двойное освобождение, обращение после освобождения, переполнение буфера и несоответствующее использование delete. Предотвращайте их с помощью умных указателей и контейнеров, а остальные обнаруживайте с помощью средств проверки памяти и Valgrind.
Часто задаваемые вопросы
Урок «Распространённые ошибки работы с памятью» бесплатный?
Да — полный текст урока «Распространённые ошибки работы с памятью» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Распространённые ошибки работы с памятью»?
Избегайте утечек и висячих указателей Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Распространённые ошибки работы с памятью»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Выделение в стеке
- Выделение в куче с new/delete
- Время жизни объектов
- Распространённые ошибки работы с памятью