КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Динамическое выделение памятиВ языке С++ память можно выделять динамически. Динамическое распределение памяти используется, прежде всего, тогда, когда заранее неизвестно, сколько объектов понадобится в программе, и понадобятся ли они вообще. С помощью динамического распределения памяти можно гибко управлять временем жизни объектов, например, выделить память не в самом начале программы (как для глобальных переменных), но, тем не менее, сохранять нужные данные в этой памяти до конца программы. Распределяя подобным образом память динамически, ваша программа непрерывно изменяет свои потребности без дополнительного программирования. Если ваша программа запрашивает память во время выполнения, она указывает требуемое количество памяти, а используемый оператор языка C++ возвращает указатель на эту память. В этом параграфе рассматриваются действия, которые должна выполнить ваша программа для динамического распределения памяти, а впоследствии освобождения памяти во время выполнения. Вы освоите следующие основные концепции:
Динамическое распределение памяти во время выполнения является чрезвычайно полезной возможностью. Использование оператора new Память для величины какого-либо типа можно выделить, выполнив операцию new. В качестве операнда выступает название типа, а результатом является адрес выделенной памяти. long* lp; lp = new long; // выделить память под новое целое число
float* cp; // создать новый объект типа float cp = new float; Созданный таким образом объект существует до тех пор, пока память не будет явно освобождена с помощью операции delete. В качестве операнда delete должен быть задан адрес, возвращенный операцией new: delete lp; delete cp; Если необходимо динамически создать массив, то нужно использовать немного другую форму new. Предположим, что вашей программе необходим массив для хранения 50 целочисленных значений. Используя оператор new, вы можете заказать эту память, как показано ниже: int *buffer = new int[50]; Говоря кратко, если оператор new успешно выделяет память, он возвращает указатель на начало области этой памяти. В данном случае, поскольку программа распределяет память для хранения массива целых чисел, она присваивает возвращаемый указатель переменной, определенной как указатель на тип int. Если оператор new не может выделить запрашиваемый вами объем памяти, он возвратит NULL-указатель, который содержит значение 0. Каждый раз, когда программа динамически распределяет память с использованием оператора new, она должна проверять возвращаемое оператором new значение, чтобы определить, не равно ли оно NULL. Чтобы определить, выделил ли оператор new память, ваша программа должна сравнить значение указателя с NULL, как показано в примерах ниже: Пример 1. Следующая программа использует оператор new для получения указателя на 100-элементный целочисленный массив: #include "stdafx.h" #include <iostream.h> void main() { Как видите, программа сразу проверяет значение, присвоенное оператором new переменной-указателю. Если указатель содержит значение NULL, значит new не смог выделить запрашиваемый объем памяти. Если же указатель содержит не NULL, следовательно, new успешно выделил память и указатель содержит адрес начала блока памяти.
|