Коллекции и управление памятью
Поскольку элементы коллекций располагаются в динамической памяти, при их
использовании особенно важными становятся вопросы контроля за состоянием кучи.
Любая коллекция не может расти до бесконечности: с одной стороны, ее размеры
определяются доступной памятью и размером элементов, с другой стороны - общее
количество элементов коллекции не может превышать
65520 div SizeOf (Pointer) = 16380
Иными словами, все указатели на элементы коллекции должны располагаться в
пределах одного сегмента. Величина 16380 задается значением глобальной константы
MaxCollectionSize, объявленной в интерфейсной части модуля Objects.
Таким образом, при наполнении коллекции необходимо следить за общим
количеством элементов (переменная TCollection.Couni), которое не может превысить
значение, задаваемое константой MaxCollectionSize. Кстати, если при обращении к
методу TCollection.Init начальное значение N0 коллекции указано слишком большим,
оно заменяется на MaxCollectionSize.
Элементы коллекции обычно размещаются в куче, поэтому перед размещением
очередного элемента следует проверить доступную память (возвращается стандартной
функцией MaxAvail).
В ходе расширения коллекции может оказаться, что динамической памяти не
хватает для размещения нового массива указателей (напомню, что расширение
коллекции заключается в создании нового массива из NO + k*ND указателей, где N0
- начальная длина, ND - шаг наращивания коллекции, k= 1,2, ...; после этого в
новый массив копируется старый массив указателей, а место, выделенное под
размещение старого массива, возвращается в кучу). Если обнаружена нехватка
памяти для расширения коллекции или если при обращении к методу TCollection.At
указан индекс, превышающий размер коллекции, вызывается метод TCollection.Error.
По умолчанию этот метод завершает выполнение программы с кодом 212 ошибки
периода исполнения. Вы можете перекрыть TCollection.Error, чтобы нужным образом
отреагировать на возникшую ситуацию. В этом случае следует учесть, что заголовок
TCollection.Error в Turbo Vision имеет следующий вид:
Procedure TCollection.Error (Code, Info':
Integer);
Параметр Code в стандартных ситуациях соответствует следующим константам:
- coIndexError = -1 - индекс метода At превысил значение Count-1; параметр
Info содержит неверный индекс;
- coOverflow = -2 - нет памяти для расширения коллекции; параметр Info
содержит требуемый размер коллекции. Константы соХХХХ определены в интерфейсной
части модуля Objects.