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

Как преобразовать строку в int в C++ Программирование и разработка

Обычно при использовании исходных кодов на языке программирования C++ компилятор вручную выделяет память переменной для хранения данных. Говорят, что это выделение статической памяти. Это фиксированная память, которую нельзя изменить после объявления. Для этого типа распределения памяти операционная система использует стек для хранения данных. При статическом распределении память выделяется до того, как исходный код начнет выполняться.

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

Отличие выделения памяти от обычных переменных

В обычных переменных память, выделяемая компилятором, выделяется и освобождается автоматически. Когда память выделяется программистом динамически, ему приходится удалять или освобождать память, когда она бесполезна при дальнейшем выполнении исходного кода. Эта ситуация вызывает «утечку памяти», когда программа завершается, а память не освобождена.

Операторы для динамического размещения

В C++ в выделении и освобождении памяти помогают два оператора: «новый» и «удалить», которые используются для более эффективного выделения и освобождения памяти.

Новый оператор

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

Pointer object = new datatype;

Удалить оператора

Как и оператор new, оператор удаления используется для удаления выделенной памяти. В C++ программист может использовать этот оператор для освобождения памяти.

# Delete pointer_variable;

Пример 1

В этом примере мы введем два указателя: один — указатель целочисленного типа, а другой — указатель с плавающей запятой. Указатели инициализируются с помощью знака звездочки с ними.

# Int * pointInt;
# Float *pointfloat;

Используя эти два принтера, мы будем динамически выделять память.

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

Поскольку ключевое слово «новое» используется для динамического выделения памяти при ручном выделении, память выделяется компилятором. Нам не нужно выделять память во время выполнения. Но поскольку динамическое выделение является случайным, нам нужно идентифицировать указатели, и для процесса привязки используется этот новый оператор.

# Pointint = new int;

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

# *pointInt = 50;

Также объявляется значение float для точек с плавающей запятой. Отображение значений после присвоения.

Как мы уже говорили, оператор «new» используется для выделения памяти, а «delete» — для ее освобождения. Поэтому, как только вы завершите задачу или операцию в коде, мы удалим память, выделенную для задачи.

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

Delete point float;

Как только вы сохраните код в текстовом редакторе

Как только вы сохраните код в текстовом редакторе, терминал Ubuntu позволит вам выполнить исходный код внутри файла с помощью компилятора g++.

$ g++ -o mem mem.c
$ ./mem

После выполнения вы увидите значения, присвоенные памяти.

Пример 2

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

Когда пользователь вводит количество студентов, память выделяется для каждого числа. Здесь инициализируется указатель типа float, который будет использоваться при выделении памяти для результатов.

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

Мы берем указатель с плавающей запятой, так как GPA

Ptr= new float[num]

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

Delete [] ptr;

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

ла пользователю будет предложено ввести количество студе

Пример 3

В этом примере используются операторы new и delete для объекта класса. Этот класс содержит закрытую переменную целочисленного типа, в которой хранится возраст. В общедоступной части класса создается конструктор, который инициализирует возраст числом «10». Здесь используется другая функция, которая будет отображать возраст, который инициализируется в конструкторе.

том примере используются операторы new и delete для

Теперь перейдем к основной программе динамического размещения. Объект класса создается динамически.

Student * ptr = new student ();

огда объект будет сформирован, конструктор б

Когда объект будет сформирован, конструктор будет реализован автоматически. Будет сделан вызов функции, чтобы получить возраст. Это будет сделано через ptr.

Ptr > getAge();

И в конце память будет освобождена.

в конце память будет освоб

Заключение

Динамическое выделение памяти выделяется программистом во время выполнения вместо фиксированной памяти, определяемой компилятором. Это распределение является случайным и может быть устранено после его использования. Принимая во внимание, что в большинстве случаев перед удалением процесс выполнения останавливается, и это динамическое выделение вызывает утечку памяти. Мы реализовали это явление в различных подходах в системе Ubuntu Linux, используя язык программирования C++.

Читайте также:  Примеры полиморфизма в C++
Оцените статью
bestprogrammer.ru
Добавить комментарий