Освобождение памяти и 'delete'
Часть раздела Логика и управление потоком путешествия по C++ на Coddy — урок 7 из 56.
Когда вы выделяете память динамически с помощью new, эта память не исчезает автоматически, когда вы заканчиваете с ней работать. В отличие от обычных переменных, которые очищаются автоматически, динамически выделенная память остается занятой до тех пор, пока вы явно не освободите ее. Именно здесь ключевое слово delete становится необходимым.
Ключевое слово delete освобождает память, которая была ранее выделена с помощью new. Когда вы используете delete, вы сообщаете системе, что закончили работу с этой памятью, и она может быть повторно использована для других целей:
int* ptr = new int(42); // Выделение памяти
// Использование памяти...
delete ptr; // Освобождение памятиФундаментальное правило управления динамической памятью простое: на каждый new должен приходиться соответствующий delete. Если вы забудете удалить динамически выделенную память, вы создадите утечку памяти — ваша программа продолжает удерживать память, которую она больше не использует, что в конечном итоге может привести к нехватке доступной памяти в системе.
После вызова delete для указателя, этот указатель становится недействительным и его не следует использовать снова. Хорошей практикой считается установка указателя в nullptr после удаления, чтобы избежать его случайного использования.
Задание
ЛегкоСоздайте программу, которая демонстрирует полный жизненный цикл динамической памяти путем выделения памяти с помощью new, ее использования и последующего правильного освобождения с помощью delete.
Будут предоставлены следующие входные данные:
- Целочисленное значение для хранения в динамически выделенной памяти
- Второе целочисленное значение для обновления сохраненного значения
Ваша программа должна:
- Использовать
newдля динамического выделения памяти под целое число и сохранить указатель в переменной с именемdynamicPtr - Присвоить первое входное значение динамически выделенной памяти, используя оператор разыменования
- Вывести начальное значение, хранящееся в динамически выделенной памяти
- Обновить значение в динамически выделенной памяти на второе входное значение
- Вывести обновленное значение
- Использовать
deleteдля освобождения динамически выделенной памяти - Установить указатель в
nullptrпосле удаления - Вывести подтверждающее сообщение о том, что память была освобождена
Используйте следующий точный формат вывода:
Initial value: [first value]
Updated value: [second value]
Memory freed successfullyШпаргалка
Ключевое слово delete освобождает память, которая была ранее выделена с помощью new:
int* ptr = new int(42); // Выделение памяти
// Использование памяти...
delete ptr; // Освобождение памятиДля каждого new должен быть соответствующий delete, чтобы избежать утечек памяти.
После вызова delete установите указатель в nullptr, чтобы избежать случайного использования невалидной памяти:
delete ptr;
ptr = nullptr;Попробуйте сами
#include <iostream>
using namespace std;
int main() {
// Считать входные значения
int firstValue, secondValue;
cin >> firstValue;
cin >> secondValue;
// TODO: Напишите свой код ниже
// 1. Выделить память с помощью new и сохранить в dynamicPtr
// 2. Присвоить firstValue выделенной памяти
// 3. Вывести начальное значение
// 4. Обновить значением secondValue
// 5. Вывести обновленное значение
// 6. Удалить память и установить указатель в nullptr
// 7. Вывести подтверждающее сообщение
return 0;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Указатели и память
Что такое указатель?Оператор взятия адресаОператор разыменованияНулевые указателиУказатели и массивыДинамическая память и 'new'Освобождение памяти и 'delete'Итоги: Практика с указателями2Векторы (динамические массивы)
Знакомство с std::vectorСоздание вектораДобавление элементовДоступ к элементамРазмер вектораИтерация с помощью цикла ForRange-based цикл ForУдаление элементовИтоги: операции с векторами5Проект: Инструмент инвентаризации
Настройка проектаДобавление и обновление товаров