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

Dinamiceskoe Vydelenie Pamati V C



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

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

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

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







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

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



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

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



Объект указателя знак равно новый данные - тип ;

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

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





# Удалить pointer_variable;

Пример 1

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

# Int * pointInt;
# Плавающая *pointfloat;

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



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

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

# Pointint = новый интервал;

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

# *pointInt = 50;

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

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

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

Удалить точку плавать ;

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

$ g++ -o память mem.c
$ ./мем

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

Пример 2

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

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

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

Птр знак равно новый плавать [ на одном ]

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

Удалить [ ] указатель ;

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

Пример 3

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

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

Ученик * указатель знак равно новый ученик ( ) ;

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

Птр - > getAge ( ) ;

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

Вывод

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