Динамическая память С++
Хорошее понимание того, как на самом деле работает динамическая память в C++, необходимо для того, чтобы стать хорошим программистом на C++. Память в вашей программе на C++ разделена на две части —
-
Стек − Все переменные, объявленные внутри функции, будут занимать память из стека.
-
Куча − Это неиспользуемая память программы, которую можно использовать для динамического выделения памяти при запуске программы.
Во многих случаях вы не знаете заранее, сколько памяти вам потребуется для хранения конкретной информации в определенной переменной, и размер требуемой памяти можно определить во время выполнения.
Вы можете выделить память во время выполнения в куче для переменной заданного типа, используя специальный оператор в C++, который возвращает адрес выделенного пространства. Этот оператор называется новый оператор.
Если вам больше не нужна динамически выделяемая память, вы можете использовать удалить оператор, который отменяет выделение памяти, ранее выделенной оператором new.
создать и удалить операторы
Существует следующий общий синтаксис для использования new оператор для динамического выделения памяти для любого типа данных.
06
Здесь тип данных может быть любым встроенным типом данных, включая массив, или любыми определяемыми пользователем типами данных, включая класс или структуру. Начнем со встроенных типов данных. Например, мы можем определить указатель на тип double, а затем запросить выделение памяти во время выполнения. Мы можем сделать это с помощью нового оператор со следующими утверждениями —
15пре>Память могла быть не выделена успешно, если свободное хранилище было израсходовано. Поэтому рекомендуется проверить, возвращает ли новый оператор указатель NULL, и предпринять соответствующие действия, как показано ниже —
23malloc() функция из C, все еще существует в C++, но рекомендуется избегать использования функции malloc(). Основное преимущество new перед malloc() заключается в том, что new не просто выделяет память, а создает объекты, что является основной целью C++.
В любой момент, когда вы чувствуете, что динамически выделенная переменная больше не требуется, вы можете освободить память, которую она занимает в свободном хранилище, с помощью оператора «удалить» следующим образом —
37Давайте поместим вышеприведенные концепции и сформируем следующий пример, чтобы показать, как работают «новый» и «удалить» —
Живая демонстрация45Если мы скомпилируем и запустим приведенный выше код, это даст следующий результат —
54Динамическое выделение памяти для массивов
Предположим, вы хотите выделить память для массива символов, т. е. строки из 20 символов. Используя тот же синтаксис, который мы использовали выше, мы можем динамически выделять память, как показано ниже.
66Чтобы удалить массив, который мы только что создали, оператор будет выглядеть следующим образом —
78Следуя аналогичному общему синтаксису оператора new, вы можете выделить многомерный массив следующим образом —
85Однако синтаксис для освобождения памяти для многомерного массива останется таким же, как указано выше —
95Динамическое выделение памяти для объектов
Объекты ничем не отличаются от простых типов данных. Например, рассмотрим следующий код, в котором мы собираемся использовать массив объектов для пояснения концепции —
Живая демонстрация102Если бы вы выделили массив из четырех объектов Box, конструктор Simple вызывался бы четыре раза, и аналогичным образом при удалении этих объектов деструктор также вызывался бы такое же количество раз.
Если мы скомпилируем и запустим приведенный выше код, это даст следующий результат —
110
Язык C