рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

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

Динамические объекты. Выделение и высвобождение памяти. Деструкторы. - раздел Программирование, Объектно-ориентированное программирование Указатель На Объект Устроен Так Же, Как Обычные Указатели: ...

Указатель на объект устроен так же, как обычные указатели:

 
 


Описание указателей на объект:

type tpCircle=^tCircle; {тип "указатель на объект типа tCircle"}

var pCircle:tpCircle; {экземпляр этого типа, т.е. указатель на объект

типа tCircle}

pCircle:^tCircle; {другой вариант описания указателя на экземпляр

класса tCircle}

Создание нового объекта в "куче" (heap), на который при создании этого объекта "переключается" указатель pCircle:

New(pCircle);

Независимо от числа созданных объектов, pCircle указывает на последний из таких объектов. Если два раза сделать такой вызов, т.е. New(pCircle), то указатель на предпоследний объект потеряется, как и в случае с обычными динамическими переменными (см. Часть1).

Доступ к полям объекта:

a:=pCircle^.X;

pCircle^.MoveBy(10,21)

и т.п. При этом pCircle читается как "указатель на объект типа tCircle", а pCircle^ — как "объект типа tCircle, на который ссылается указатель pCircle".

Если в объекте есть виртуальные методы, он обязательно должен быть инициализирован конструктором до вызова первого своего метода:

pCircle^.Init(100,100,50);

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

New(pCircle,Init(100,100,50));

Указатель на динамически создаваемый экземпляр можно сразу получить, используя New как функцию. Стоит отметить, что при этом в качестве параметра оператора New ставится не имя указателя, а имя его типа. При этом динамически создается экземпляр указанного типа. Так, если:

type tpArc=^tArc;

var pArc:tpArc;

то можно записать либо

New(pArc);

pArc^.Init(100,100,20,0,90);

либо

pArc:=New(tpArc);

pArc^.Init(100,100,20,0,90);

либо

pArc:=New(tpArc,Init(100,100,20,0,90));

Последняя форма записи короче и надежнее (в других есть возможность вызова конструктора не сразу, а после произвольного числа операторов, и по ошибке виртуальный метод можно вызвать до вызова конструктора). Поэтому при работе с объектами практически всегда используют New в форме функции, когда одновременно идет инициализация конструктором.

Удаление объекта (обычно динамического) производится с помощью вызова специального метода — деструктора. Конструкторов и деструкторов для одного объекта может быть несколько. Если основной конструктор в Turbo Pascal обычно называют Init, то основной деструктор — Done ("сделано"). Деструкторы, в отличие от конструкторов, могут быть виртуальными. Более того, их рекомендуется делать виртуальными, так как в них обычно отсутствуют параметры.

Высвобождение памяти, занимаемой динамическими объектами, производится с помощью оператора Dispose, который имеет обычный для динамических переменных синтаксис:

Dispose(pCircle);

Этот оператор высвобождает память, занимаемую объектом, на который указывает указатель (т.е. на который он "настроен", "переключен"). Надо отметить, что сам указатель pCircle при этом не уничтожается, а продолжает указывать на то же место в памяти. Вызов через pCircle объекта aCircle после того, как соответствующий ему участок памяти высвобожден, недопустим и обычно вызывает ошибку выполнения программы или "зависание" компьютера. Если в объекте есть динамически созданные поля или структуры, их надо убирать в определенной последовательности (иначе либо они могут остаться в памяти как "мусор", либо может произойти попытка повторно убрать уже уничтоженную часть структуры). Поэтому обычно используют специальный метод (в Borland Pascal рекомендуется называть его Done) для удаления динамического объекта. Его желательно делать виртуальным. В этом случае при наличии полиморфизма заранее неизвестно, что удаляется: прародитель или потомок, так как указатель может быть настроен либо на того, либо на другого, и это узнается только во время работы программы. А число полей и, соответственно, занимаемый размер памяти у этих объектов разный. Чтобы правильно производить удаление из памяти полиморфных объектов, метод объявляют деструктором. При этом работа метода замедляется, т.к. происходит проверка, кто вызван — прародитель или потомок. Но зато автоматически высвобождается правильное количество памяти (на основе доступа к механизму позднего связывания при вызове специального варианта Dispose с деструктором):

Dispose(pCircle,Done);

Вызов деструктора без Dispose не приводит к автоматическому высвобождению памяти, и он работает как обычный метод. Надо отметить, что идеология работы с конструкторами и деструкторами в Turbo Pascal является запутанной и непродуманной. Эти недостатки ликвидированы в Delphi.

 

– Конец работы –

Эта тема принадлежит разделу:

Объектно-ориентированное программирование

На сайте allrefs.net читайте: "Объектно-ориентированное программирование"

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Динамические объекты. Выделение и высвобождение памяти. Деструкторы.

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

Object PASCAL
(72 часа) Вадим Валериевич Монахов, доцент кафедры вычислительной физики СпбГУ Введение   1.1. Основной принцип ст

Алфавит языка PASCAL. Идентификаторы.
Основной алфавит языка PASCAL состоит из латинских букв и цифр. Буквы: ABCD...XYZ — заглавные (прописные), abcd...xyz — строчные, а также знак _

Простые и составные специальные символы, используемые на ПК.
Перечисленный ниже набор несколько расширяет стандарт PASCAL, однако на ПК является стандартом de facto. Простые специальные символы: + Плюс – “сложени

Стандартные типы данных. Двоичное представление чисел и дополнительный код.
Целые типы Byte: 0..255 — байтовый (1 байт) ShortInt: -128..127 — короткое целое (1 байт) Word: 0..65535 — 16-ричное слово (2 байта) Inte

Арифметические операторы.
Бинарные полиморфные (тип результата определяется по правилам приведения типов, см. далее): + сложение (все целые и вещественные типы, строковые типы, множества).

Логические операторы и операции отношения.
Логические операторы: and логическое "И". Пример: a and b or логическое "ИЛИ": a or b xor логическое "исключающее ИЛИ": a xor b not

Потеря точности, потеря порядка и переполнение при арифметических операциях.
Пусть x1 – арифметическая переменная real, x2 – вещественная extended. Тогда выполнение присваиваний x2:=1+1e-14 даст 1.00000000000001, а x1:=1+1e-14 даст 10000000000000,т.к. числа real имеют всего

Структура простейшей программы.
В PASCAL любое число пробелов, символов <TAB> или переносов на новую строку везде приводится к одному пробелу (конечно, кроме строковых выражений). Имя файла с текстом программы должно быть т

Простейшие операторы языка Object PASCAL
2.9.1. Пустой и составной операторы. Операторы в языке PASCAL разделяется символом ";". Пустой оператор — это просто пустая строка (или эквивален

Процедуры и функции. Формальные и фактические параметры. Передача параметров по ссылке, по значению и через указатель.
Процедуры по своей структуре напоминают независимую программу, вложенную в основную программу. Главное их отличие в том, что они, как правило, имеют параметры, передаваемые из внешнего программного

Локальные и глобальные переменные. Побочный эффект функции. Вложенность процедур и функций. Правила видимости.
В приведенных выше примерах часть переменных описана в блоке описания переменных программы. Такие переменные называются глобальными. Они существуют в любой момент выполнения программы. Другая часть

Модули. Секции декларации, интерфейса и реализации. Области видимости.
На самом деле общая структура модуля при наличии в нем класса несколько сложнее. Обсудим ее более подробно. Написание собственного модуля (unit) начинается с указания имени модуля. В нашем

Классы, экземпляры класса, наследование, иерархия.
Объектный тип (например, tDot) называется классом. Переменная данного типа — объект или, что то же самое, экземпляр класса. То есть при задании Var dDot:tDot переменная dDot – это

Пример объектно-ориентированной программы: движение фигур по экрану.
unit Figures; interface uses…; type tLocation= object X,Y:Integer; procedure Init(X_,Y_:Integer); function GetX:Integer;

Виртуальные методы. Конструкторы. Раннее и позднее связывание. Полиморфизм.
В приведенной выше программе при описании объектов некоторые методы заданы как виртуальные (virutal). В этом случае перед вызовом какого-либо метода соответствующего экземпляра класса (переменной о

Правила присваивания. Совместимость типов для объектов.
Для потомков при использовании их "на месте" прародителей любого уровня имеется два основных варианта совместимости типов (по вызовам и по присваиваниям) между: 1. экземплярами о

Пример на создание, присваивание и уничтожение динамических объектов.
Unit FigDemo1; Uses…,Figures,FigArc; var FigKey:char; Ang1_ini,Ang2_ini,R_ini,X_ini,Y_ini:Integer; newX,newY,newR:Integer; pFigure:tpDot; outside:Boolea

Пример динамического выделения и высвобождения памяти для однонаправленного списка объектов.
Создадим список, в котором хранятся различные фигуры — объекты иерархии с классом-прародителем tDot. Введем запись типа "узел", ссылающийся на одну фигуру и один другой (предыдущий) узел:

Очередь, стек, двунаправленный список.
Совершенно аналогичным образом можно создавать объект — двунаправленный список, в котором каждый узел имеет указатели как "влево" (на предыдущий узел), так и "вправо" (на послед

Классы, объекты, поля и методы.
В Object Pascal класс — тип записи, который может иметь в своем составе поля данных и методы (а также свойства, но о них будет отдельный разговор). Пример описания класса и переменн

Свойства.
В Delphi пожелание ООП "не обращаться из программы к полям, а действовать через методы" нашло отражение в новом для ООП принципе — свойствах объекта. Свойство определяется

Создание и уничтожение объектов. Конструкторы и деструкторы.
В Object Pascal объекты могут быть только динамическими! Любая переменная объектного типа — это указатель, но доступ к объекту идет без 'шляпки', а создание нового объекта осуществляется не операто

Наследование. Статические, виртуальные, динамические и абстрактные методы.
Все классы Delphi — потомки класса tObject. Если нет указания, какой класс является прародителем, значит, это tObject. Определение tMyObject=class ... end; полно

Области видимости объектов.
В Delphi существуют зарезервированные слова public ("общие"), protected ("защищенные") и private ("личные") для определения специальных правил видимости областей кода

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

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

События и их делегирование. Обработка событий.
События — это свойства процедурного типа. Их название принято начинать с префикса "on". Для описания события некого типа (как описать новый тип события будет рассказано далее) в объекте н

Методы класса и указатели на класс.
Некоторые методы бывает нужно вызывать без создания экземпляра класса (например, для получения информации о имени класса, размере экземпляра класса и т.п.). Такие методы называются методами класса

Дополнительные возможности Object Pascal.
4.17.4. Функции а) могут возвращать значения определенных пользователем типов, включая сложные; б) внутри каждой функции предопределена доступная по чтению и записи локальн

Визуальное проектирование в среде Delphi.
Перед началом работы обычно надо настроить пути к библиотеке Delphi, а в Delphi 3.0 также установить пакеты. Это связано с тем, что Windows 95 (и, тем более, NT 4.0) имеет индивидуальные настройки

Создание экранных форм. Инспектор объектов.
При входе в Delphi автоматически открывается проект "по умолчанию". Изначально это проект с пустой экранной формой, на которой пунктиром показана сетка, к которой идет привязка для выравн

Палитра компонентов.
Мы будем описывать только наиболее важные свойства и события для компонентов и перечислим только наиболее часто используемые компоненты из стандартных библиотек Delphi 3.0. Для Delphi 2.0 практичес

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

Особенности разработки DLL
Работа программ с DLL (Dynamic Link Library) поддерживается операционной системой, а не компилятором какого-либо языка программирования. Они представляют собой универсальный механизм использования

ActiveX
Подпроцессы (Threads) Для создания дополнительного подпроцесса в программах Delphy предназначен специальный модуль (в репозитории он представлен пиктограммой Thread Object

Использование библиотек OpenGL и GLU
5.21. Создание программистом собственного компонента Литература 1. В.В.Фаронов . Delphi 6. Учебный курс.- М.:"Нолидж", 2001.- 608 с.

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги