Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

Динамическая память в C++: стек против кучи

Хорошее понимание работы динамической памяти в C++ необходимо для становления хорошим C++ программистом. Память в программе на C++ делится на две части:

Часто заранее неизвестно, сколько памяти потребуется для хранения определённой информации в переменной, и размер требуемой памяти может быть определён только во время выполнения.

Можно выделить память во время выполнения в куче для переменной заданного типа с помощью специального оператора C++, возвращающего адрес выделенного пространства. Этот оператор называется new.

Если динамически выделенная память больше не нужна, можно использовать оператор delete, который освобождает память, ранее выделенную оператором new.

Операторы new и delete

Общий синтаксис использования оператора new для динамического выделения памяти под любой тип данных:

new тип_данных;

Здесь тип_данных может быть любым встроенным типом, включая массив, или любым пользовательским типом (класс или структура). Начнём со встроенных типов. Например, определим указатель на double и запросим выделение памяти во время выполнения:

double* pvalue = NULL; // Указатель инициализирован нулем
pvalue = new double;   // Запрос памяти для переменной

Память может не быть выделена успешно, если свободное хранилище исчерпано. Хорошей практикой является проверка, не вернул ли new нулевой указатель, и принятие соответствующих мер:

double* pvalue = NULL;
if( !(pvalue = new double) ) {
    cout << "Error: out of memory." << endl;
    exit(1);
}

Функция malloc() из C всё ещё существует в C++, но рекомендуется избегать её использования. Главное преимущество new перед malloc() — new не просто выделяет память, он конструирует объекты, что является главной целью C++.

В любой момент, когда динамически выделенная переменная больше не нужна, можно освободить занимаемую ею память в свободном хранилище с помощью оператора delete:

delete pvalue; // Освобождение памяти, на которую указывает pvalue

Пример, показывающий работу new и delete:

Live Demo
#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

Динамическое выделение памяти для массивов

Допустим, нужно выделить память для массива символов (строки из 20 символов). Используя тот же синтаксис:

char* pvalue = NULL;
pvalue = new char[20];

Для удаления созданного массива:

delete [] pvalue; // Удаление массива, на который указывает pvalue

Для многомерного массива:

double** pvalue = NULL;
pvalue = new double[3][4]; // Выделение памяти для массива 3x4

Синтаксис освобождения памяти для многомерного массива остаётся прежним:

delete [] pvalue;

Динамическое выделение памяти для объектов

Объекты ничем не отличаются от простых типов данных. Пример с массивом объектов для прояснения:

Live Demo
#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

  1. Понимание типов данных C++: основы, модификаторы и лучшие практики
  2. Освоение операторов C++: полное руководство с практическими примерами
  3. Комментарии в C++: лучшие практики для читаемого и поддерживаемого кода
  4. Динамическое управление памятью в C: malloc, calloc, realloc, free
  5. Язык программирования C++: обзор и ключевые особенности
  6. Константы и литералы в C++: типы, синтаксис и лучшие практики
  7. Полное руководство по операторам C++: типы, использование и лучшие практики
  8. Работа с числовыми типами в C++: практическое руководство
  9. Ссылки в C++: ключевые концепции и отличия от указателей
  10. Динамическая память в C++: стек против кучи