Динамическая память в C++: стек против кучи
Хорошее понимание работы динамической памяти в C++ необходимо для становления хорошим C++ программистом. Память в программе на C++ делится на две части: Стек (stack) — все переменные, объявленные внутри функции, выделяют память из стека. Куча (heap) — это неиспользуемая память программы, которая может использоваться для динамического выделения памяти во время выполнения. Часто заранее неизвестно, сколько памяти потребуется для хранения определённой информации в переменной, и размер требуемой памяти может быть определён только во время выполнения. Можно выделить память во время выполнения в куче для переменной заданного типа с помощью специального оператора C++, возвращающего адрес выделенного пространства. Этот оператор называется new. Если динамически выделенная память больше не нужна, можно использовать оператор delete, который освобождает память, ранее выделенную оператором Общий синтаксис использования оператора new для динамического выделения памяти под любой тип данных: Здесь тип_данных может быть любым встроенным типом, включая массив, или любым пользовательским типом (класс или структура). Начнём со встроенных типов. Например, определим указатель на Память может не быть выделена успешно, если свободное хранилище исчерпано. Хорошей практикой является проверка, не вернул ли Функция malloc() из C всё ещё существует в C++, но рекомендуется избегать её использования. Главное преимущество В любой момент, когда динамически выделенная переменная больше не нужна, можно освободить занимаемую ею память в свободном хранилище с помощью оператора Пример, показывающий работу Результат: Допустим, нужно выделить память для массива символов (строки из 20 символов). Используя тот же синтаксис: Для удаления созданного массива: Для многомерного массива: Синтаксис освобождения памяти для многомерного массива остаётся прежним: Объекты ничем не отличаются от простых типов данных. Пример с массивом объектов для прояснения: При выделении массива из четырёх объектов Результат:
new.Операторы new и delete
new тип_данных;
double и запросим выделение памяти во время выполнения:double* pvalue = NULL; // Указатель инициализирован нулем
pvalue = new double; // Запрос памяти для переменной
new нулевой указатель, и принятие соответствующих мер:double* pvalue = NULL;
if( !(pvalue = new double) ) {
cout << "Error: out of memory." << endl;
exit(1);
}
new перед malloc() — new не просто выделяет память, он конструирует объекты, что является главной целью C++.delete:delete pvalue; // Освобождение памяти, на которую указывает pvalue
new и delete:#include <iostream>
using namespace std;
int main() {
double* pvalue = NULL;
pvalue = new double;
*pvalue = 29494.99;
cout << "Value of pvalue : " << *pvalue << endl;
delete pvalue;
return 0;
}
Value of pvalue : 29495
Динамическое выделение памяти для массивов
char* pvalue = NULL;
pvalue = new char[20];
delete [] pvalue; // Удаление массива, на который указывает pvalue
double** pvalue = NULL;
pvalue = new double[3][4]; // Выделение памяти для массива 3x4
delete [] pvalue;
Динамическое выделение памяти для объектов
#include <iostream>
using namespace std;
class Box {
public:
Box() { cout << "Constructor called!" << endl; }
~Box() { cout << "Destructor called!" << endl; }
};
int main() {
Box* myBoxArray = new Box[4];
delete [] myBoxArray;
return 0;
}
Box конструктор вызывается четыре раза, и деструктор — тоже четыре раза при удалении.Constructor called!
Constructor called!
Constructor called!
Constructor called!
Destructor called!
Destructor called!
Destructor called!
Destructor called!
Язык C
- Понимание типов данных C++: основы, модификаторы и лучшие практики
- Освоение операторов C++: полное руководство с практическими примерами
- Комментарии в C++: лучшие практики для читаемого и поддерживаемого кода
- Динамическое управление памятью в C: malloc, calloc, realloc, free
- Язык программирования C++: обзор и ключевые особенности
- Константы и литералы в C++: типы, синтаксис и лучшие практики
- Полное руководство по операторам C++: типы, использование и лучшие практики
- Работа с числовыми типами в C++: практическое руководство
- Ссылки в C++: ключевые концепции и отличия от указателей
- Динамическая память в C++: стек против кучи