Внутренний механизм Visual FoxPro API обеспечивает прямой доступ к Менеджеру динамической памяти Visual FoxPro (Dynamic Memory Manager). Модули API запрашивают Блоки Памяти в качестве Дескрипторов блоков (указателей), которые в дальнейшем используют. Система Visual FoxPro использует в своей деятельности архитектуру Сегментной Загрузки (Segment-Loading Architecture) для распределения Дескрипторов Блоков, вместо обычных указателей, что значительно Эффективнее при использовании Памяти.

Дескриптор блока памяти является, по-сути, индексом в массиве Указателей (Index in an Array of Pointers). Координата каждого Указателя на блок памяти известна системе Visual FoxPro. Почти все ссылки на указатели блоков памяти в модулях API заменены описанными выше Дескрипторами, в отличие от стандартных указателей языка "C".

Понимание Стэка (Understanding Stacks)

Создаваемый вами Контрол или Библиотека не имеет свой собственный Стэк Памяти. Вместо этого, они используют Стэки вызываемых Программ или, в крайнем случае, стэк системы Visual FoxPro. Однако, вы не можете управлять размером используемого Стэка Visual FoxPro  или влиять на используемый размер памяти контролами ActiveX или библиотеками FLL.

В обычных условиях данные различия не имеют особого значения. Система Visual FoxPro имеет достаточно большой размер Стэка для размещения всех необходимых вам переменных, используемых в Контроле или Библиотеке. Если места в Стэке недостаточно, вы всегда можете динамически перераспределить блоки памяти.

Правила по использованию Дескрипторов (Handles)

Следующие правила применяются при Размещении или Освобождении Дескрипторов блоков Памяти:

  • Пользователь должен освобождать все используемые Дескрипторы блоков памяти, включая и те, которые созданы функциями типа  _Load().

  • _Load() только создает Дескриптор блока, когда вы загружаете в переменную символьные данные (например: ev_type = 'C'). Все другие типы Данных помещают значения в структуру  Value, после загрузки реальных данных указатель на структуру помещается в MHANDLE как элемент значения ev_handle.

  • В библиотеках FLL, система Visual FoxPro сама отвечает за освобождение всех используемых Дескрипторов, возвращаемых функцией _RetVal( ). Пользователь не должен освобождать эти Дескрипторы, хотя он их и создавал

  • Пользователь не должен освобождать Дескрипторы блоков, полученные через механизм ParamBlk.

    Caution noteОбратите Внимание

    Когда вы создаете внешние Приложения, использующие вызовы внутренних функций API, обязательно проверяйте выполнение всех правил обработки данных в Памяти, а также возвращаемые Значения. Ошибочный или неверный указатель на блок памяти или Дескриптор может привести к разрушению внутренних структур памяти системы Visual FoxPro, что приведет к Аварийному завершению работы Системы, чревато потерей важных Данных.

См. также