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