Как работать с динамическим распределением памяти C ++?



В этой статье исследуется динамическое распределение памяти в C ++ - важная функция, позволяющая учитывать потребности в памяти для ресурсов в реальном времени.

Распределение динамической памяти в C ++ - это очень важная функция, которая позволяет вам учитывать ваши требования для удовлетворения потребностей в ресурсах реального времени. В этой статье мы будем исследовать Подробное исследование. В этой статье будут рассмотрены следующие указатели.

Итак, давайте начнем с этой статьи о динамическом распределении памяти в C ++.





Требуется динамическое выделение памяти?

Допустим, мы хотим ввести предложение в виде массива символов, но мы не уверены в точном количестве символов, необходимых в массиве.

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



фибоначчи в c ++

В приведенном выше случае мы не имеем представления о точном размере массива до момента компиляции (когда компьютер компилирует код и строка вводится пользователем). В таких случаях мы используем новый оператор.

C ++ определяет два унарных оператора новый и Удалить которые выполняют задачу выделения и освобождения памяти во время выполнения. Поскольку эти операторы (new и delete) работают со свободной памятью (память кучи), их также называют оператором свободного хранения. Указатели обеспечивают необходимую поддержку системы динамического распределения памяти в C ++.

С помощью динамического размещения программа может получать память во время выполнения.



Глобальные и локальные переменные выделяются в память во время компиляции. Однако мы не можем добавлять глобальные или локальные переменные во время выполнения. Если программе необходимо использовать переменный объем памяти, нам нужно будет выделить память во время выполнения по мере необходимости. И, конечно же, здесь могут служить функции динамического распределения.

Различия между распределением статической памяти и распределением динамической памяти:

Это базовая архитектура памяти, используемая для любой программы на C ++:

Память - Распределение динамической памяти - Edureka

Нам понадобится вот такое изображение

Стек используется для распределения статической памяти, а куча - для распределения динамической памяти, оба хранятся в оперативной памяти компьютера.

Переменные, которые выделяются в стеке, в то время как распределение статической памяти сохраняется непосредственно в памяти, и доступ к этой памяти очень быстрый, также ее распределение обрабатывается при компиляции программы. Когда функция или метод вызывает другую функцию, которая, в свою очередь, может вызывать другую функцию и т. Д., Выполнение всех этих функций остается приостановленным до тех пор, пока самая последняя функция не вернет свое значение. Стек всегда хранится в порядке LIFO (последний пришел - первый ушел), последний зарезервированный блок всегда является следующим блоком, который должен быть освобожден. Это помогает отслеживать стек, освобождение блока из стека - не что иное, как корректировка одного указателя.

Переменным, выделенным в куче, выделяется память во время выполнения при динамическом распределении памяти. Доступ к этой памяти немного медленнее по сравнению со стеком, но размер кучи ограничен только размером виртуальной памяти. Элементы кучи не зависят друг от друга и всегда могут быть доступны случайным образом в любой момент времени. Мы можем выделить блок в любое время и освободить его в любое время. Это затрудняет отслеживание того, какие части кучи выделены или освобождены в любой момент времени.

Продолжаем читать статью о динамическом распределении памяти в C ++

Распределение памяти с использованием новый Ключевое слово

В C ++ новый Оператор используется для выделения памяти во время выполнения, и память выделяется в байтах. В новый Оператор обозначает запрос на выделение динамической памяти в куче. Если доступно достаточно памяти, новый Оператор инициализирует память и возвращает адрес вновь выделенной и инициализированной памяти переменной-указателю.

Синтаксис:

datatype * pointer_name = новый тип данных

Пример:

int * ptr = new int // Мы можем объявить переменную при динамическом распределении двумя способами. int * ptr = new int (10) int * ptr = new int {15} // Оператор new также используется для выделения блока (массива) памяти типа data-type. int * ptr = new int [20] // Вышеупомянутый оператор динамически выделяет память для 20 целых чисел непрерывно типа int и возвращает указатель на первый элемент последовательности на указатель «ptr».

Заметка : Если в куче недостаточно памяти для выделения, новый запрос указывает на сбой, вызывая исключение std :: bad_alloc, если только с оператором new не используется «nothrow», и в этом случае он возвращает указатель NULL. Поэтому рекомендуется проверять переменную-указатель, созданную командой new, перед ее использованием в программе.

Продолжаем читать статью о динамическом распределении памяти в C ++

Освобождение памяти с помощью Удалить Ключевое слово:

После выделения памяти кучи переменной или объекту класса с помощью новый ключевое слово, мы можем освободить это пространство памяти, используя Удалить ключевое слово.

Синтаксис:

delete pointer_variable // Здесь pointer_variable - это указатель, указывающий на объект данных, созданный командой new. delete [] pointer_variable // Чтобы освободить динамически выделяемую память массива, указанную переменной-указателем, мы используем следующую форму удаления:

Пример:

удалить точку удалить [] точку

Заметка : Экстент объекта или время жизни объекта - это время, в течение которого объект остается в памяти во время выполнения программы. Выделение памяти в куче происходит медленнее, чем в стеке, поскольку в куче нет определенного порядка, в котором вы можете выделять память, тогда как в стеке он следует LIFO.

Продолжаем читать статью о динамическом распределении памяти в C ++

Динамическое размещение массивов

Основное использование концепции динамического распределения памяти - это выделение памяти для массива, когда мы должны объявить его, указав его размер, но не уверены в этом.

Давайте посмотрим на примере, чтобы понять его использование.

#include с использованием пространства имен std int main () {int len, sum = 0 cout<< 'Enter the no. of students in the class' <>len int * mark = new int [len] // Динамическое выделение памяти cout<< 'Enter the marks of each student' << endl for( int i = 0 i>* (mark + i)} для (int i = 0 i

Пояснение:
В этом примере сначала мы спрашиваем у пользователя количество студентов в классе и сохраняем его значение в переменной len. Затем мы объявляем массив целых чисел и выделяем ему пространство в памяти, динамически равное значению, хранящемуся в переменной len, используя этот оператор int * mark = new int [length], таким образом, ему выделяется пространство, равное 'length * (size of 1 целое число) '. Остальной код не требует пояснений.

Продолжаем читать статью о динамическом распределении памяти в C ++

Распределение динамической памяти для объектов

Мы также можем динамически размещать объекты.

Как мы знаем, Constructor - это специальная функция-член класса, используемая для инициализации объекта, а Destructor - также функция-член класса, которая вызывается всякий раз, когда объект выходит за пределы области видимости.

Деструктор можно использовать для освобождения памяти, назначенной объекту. Он вызывается в следующих условиях.

  • Когда локальный объект выходит за рамки
  • Для глобального объекта, когда оператор применяется к указателю на объект класса

Мы снова можем использовать указатели при динамическом выделении памяти объектам.

Давайте посмотрим на пример массива объектов.

#include с использованием пространства имен std class Random {public: Random () {cout<< 'Constructor' << endl } ~Random() { cout << 'Destructor' << endl } } int main() { Random* a = new Random[3] delete [] a // Delete array return 0 } 

Вывод:

Пояснение:

есть отношения

Конструктор будет вызываться три раза, поскольку мы выделяем память трем объектам класса Random. Деструктор также будет вызываться трижды во время каждого из этих объектов. ‘Random * a = new Random [3]’ этот оператор отвечает за динамическое распределение памяти нашего объекта.

На этом мы подошли к концу статьи о динамическом распределении памяти C ++. Если вы хотите узнать больше, ознакомьтесь с от Edureka, надежной компании онлайн-обучения. Курс обучения и сертификации по Java J2EE и SOA от Edureka разработан, чтобы обучить вас базовым и продвинутым концепциям Java, а также различным средам Java, таким как Hibernate и Spring.

Есть вопрос к нам? Пожалуйста, укажите это в разделе комментариев в этом блоге, и мы свяжемся с вами как можно скорее.