TURBO PASCAL |
Новости
|
Выделение памяти для динамических переменныхОдним из наиболее важных моментов использования указателей является распределение динамических переменных в динамически распределяемой области памяти. Borland Pascal предусматривает два способа выделения для указателя памяти: процедура New и процедура GetMem. Использование New как процедуры New - это очень простая процедура. После описания перемен- ной-указателя вы можете вызвать процедуру New для выделения пространства в динамически распределяемой памяти для указываемого переменной элемента. Приведем пример: var IntPointer: ^Integer; StringPointer: ^String; begin New(IntPointer); { выделяет в динамически распреде- ляемой области два байта } New(StringPointer); { выделяет в динамически распреде- . ляемой области 256 байт } . . end. Пример 8.2 Распределение динамической переменной с помощью процедуры New. После вызова процедуры New переменная-указатель указывает на память, выделенную в динамически распределяемой памяти. В данном примере IntPointer указывает на двухбайтовую область, выделенную процедурой New, а IntPointer^ - это допустимая целочисленная пе- ременная (хотя это целочисленное значение еще не определено). Аналогично, StringPointer указывает на выделенный для строки 256-байтовый блок, а его разыменование дает доступную для исполь- зования строковую переменную. Использование New как функции Кроме выделения памяти для конкретной динамической перемен- ной вы можете использовать New как функцию, возвращающую указа- тель конкретного типа. Например, если PInteger - это тип, опреде- ленный как ^Integer, а IntPopinter имеет тип PInteger, то следую- щие два оператора эквивалентны: New(IntPointer); IntPointer := New(PInteger); Это особенно полезно в случаях, когда может потребоваться присваивать переменной-указателю элементы различных типов. Иногда желательно распределять динамическую переменную, не присваивая явно указатель конкретной переменной. Вероятно, вы можете сделать это только создав для процедуры и функции параметр: SomeProcedure(New(PointerType)); В этом случае SomeProcedure будет добавлять передаваемый па- раметр к некоторому списку. В противном случае распределяемая па- мять будет потеряна. Библиотеки Borland Turbo Vision и Borland Pascal широко используют этот метод для присваивания динамических объектов спискам. Использование New с объектами Когда вы используете New как функцию или процедуру для выде- ления динамического объекта, то можете добавить необязательный второй параметр, который задает применяемый для инициализации объекта конструктор. В Примере 8.3 первое обращение к New распре- деляет пространство для объекта, но не инициализирует этот объ- ект. Второй вызов выделяет память и вызывает для задания объекта конструктор Init. type PMyObject = ^TMyObject; TMyObject = object constructor Init; end; var MyObject, YourObject: PMyObject; begin New(MyObject); { объект не инициализируется } New(YourObject, Init); { вызов Init для инициализации объекта } end. Пример 8.3 Создание динамических объектов. Примечание: Об объектах и их конструкторах рассказыва- ется в Главе 9 "Объектно-ориентированное программирование". |
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |