Основные ошибки при работе с указателями
Указатели позволяют вам делать в Паскале некоторые важные вещи, но есть пара моментов, которые при работе с указателями нужно отслеживать. При использовании указателей допускаются следующие общие ошибки:
- разыменование неинициализированных указателей;
- потери динамически распределяемой памяти ("утечки").
Разыменование неинициализированных указателей
Одним из общих источников ошибок при работе с указателями является разыменование указателя, который еще не был инициализирован. Как и в случае других переменных Паскаля, значение переменной-указателя не будет определено, пока вы не присвоите ей значение, так что она сможет указывать на какой-то адрес в памяти.
Перед использованием указателей им всегда нужно присваивать значения. Если вы разыменовываете указатель, которому еще не присвоено значение, то считанные из него данные могут представлять собой случайные биты, а присваивание значения указываемому элементу может затереть другие данные, вашу программу или даже операционную систему. Это звучит несколько пугающе, но при определенной дисциплине такие вещи легко отслеживаются.
Использование пустого указателя
Чтобы избежать разыменования указателей, которые не указывают на что-либо значащее, нужен некоторый способ информирования о том, что указатель недопустим. В Паскале предусмотрено зарезервированное слово nil, которое вы можете использовать в качестве содержательного значения указателей, которые в данный момент ни на что не указывают. Указатель nil является допустимым, но ни с чем не связанным. Перед разыменованием указателя вы должны убедиться, что он отличен от nil (не пуст).
Предположим, например, что у вас есть функция, возвращающая указатель на некоторый элемент в памяти. Вы можете указать, что такая функция не может найти элемент, возвращая значение nil.
Потери динамически распределяемой памяти
При использовании динамически распределяемых переменных часто возникает общая проблема, называемая утечкой динамической памяти. Утечка памяти - это ситуация, когда пространство выделяется в динамически распределяемой памяти и затем теряется - по каким-то причинам ваш указатель не указывает больше на распределенную область, так что вы не можете освободить пространство.
Общей причиной утечек памяти является переприсваивание динамических переменных без освобождения предыдущих. Простейшим случаем является следующий:
V. Объекты
1. ООП, основные понятия и определения
Объектно-ориентированное программирование – это методология программирования, которая основана на представлении программы в виде совокупности объектов, каждый из которых является реализацией определенного класса, а классы образуют иерархию на принципах наследуемости. В частности, программирование не основанное на иерархических отношениях, относится не к ООП, а к программированию на основе абстрактных типов данных. Можно сказать, что язык программирования является объектно- ориентированным тогда и только тогда, когда выполняются следующие условия:
• Имеется поддержка объектов в виде абстракции данных, имеющих интерфейсную часть в виде поименованных операций и защищенную область локальных данных.
• Объекты относятся к соответствующим типам (классам).
• Типы (классы) могут наследовать атрибуты от супертипов (суперклассов).
К базовым принципам объектно-ориентированного стиля программирования относятся:
пакетирование или инкапсуляция ;
наследование ;
полиморфизм ;
передача сообщений.
Достоинства и недостатки
Достоинства ООП:
1. спользование более естественных с точки зрения обычной повседневной практики понятий, простота введения новых понятий;
2. упрощение разработки многократно используемых компонент приложений;
3. некоторое сокращение размера программ за счет того, что повторяющиеся (наследуемые) свойства и действия можно не описывать многократно; кроме того, использование динамических объектов позволяет более эффективно распределять оперативную память;
4. возможность создания библиотеки классов; в частности, библиотека визуальных компонент Delphi и является примером такой библиотеки;
5. сравнительно простая возможность внесения изменений в программу без изменения уже написанных частей, а в ряде случаев и без перекомпиляции этих написанных и уже скомпилированных частей, используя свойства наследования и полиморфизма;
6. возможность написания подпрограмм с различными наборами формальных параметров, но имеющих одно и то же имя;
7. более четкая локализация свойств и поведения объектов конкретного класса в одном месте (используется свойство инкапсуляции), позволяющая проще разбираться со структурой программы, отлаживать ее, находить ошибки;
8. возможность разделения доступа к различным объектам программы и т. д.
Недостатки ООП
1. Умеренное быстродействие программы
2. Эффективна для больших программ