0Pricing
C++ Academy · Урок

Распространённые ошибки работы с памятью

Избегайте утечек и висячих указателей

«Распространённые ошибки работы с памятью» — бесплатный урок 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 — локальная установка не требуется.

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

  1. Выделение в стеке
  2. Выделение в куче с new/delete
  3. Время жизни объектов
  4. Распространённые ошибки работы с памятью
← Назад к C++ Academy