Диспетчер общей памяти между приложением и пакетом - PullRequest
2 голосов
/ 22 февраля 2010

Этот вопрос является продолжением этого вопроса.

Как я могу добиться, чтобы мое приложение и мой пакет времени выполнения использовали один и тот же диспетчер памяти? Я думал, что это так по умолчанию, но, поскольку я получаю странные нарушения доступа и недопустимые исключения указателя, я вставил вызов GetMemoryManagerState непосредственно перед входом в пакет времени выполнения и в пакет времени выполнения, и возвращенное состояние, кажется, указывает на то, что пакет и приложение используют отдельные диспетчеры памяти.

Перед вызовом метода в пакете времени выполнения имеется 61 выделенный блок среды, а после вызова (в начале вызываемого метода внутри пакета) - 0 выделенных блоков среды.

У вас есть объяснение этому? Что мне нужно сделать, чтобы пакет и приложение делили диспетчер памяти? Есть ли более сложные проблемы при использовании FastMM?

РЕДАКТИРОВАТЬ Кстати, есть ли лучший способ проверить, используется ли тот же диспетчер памяти, чем сравнение состояния диспетчера памяти? TMemoryManager оказывается записью, поэтому я не могу сравнить адреса.

Ответы [ 2 ]

4 голосов
/ 22 февраля 2010

Пакет использует то же состояние RTL, что и основная программа. Это часть определения пакета.

Memorymanager включительно.

Кстати, мои заметки о пакетах здесь: http://wiki.freepascal.org/packages

В настоящее время FPC все еще довольно далека от этого (в основном из-за необходимости реализовать это на множестве ОС и архитектур через внешний компоновщик). Кроме того, из-за большого количества FPC-версий в маршрутизации, я подозреваю, что это будет менее полезно, чем думают многие (я не ожидаю, что компоненты Lazarus будут когда-либо распространяться в виде двоичного FPC-эквивалента комбинаций BPLs / .dcp)

1 голос
/ 23 февраля 2010

Благодаря ldsandon и Робу Кеннеди Я понял, что необходимо использовать пакеты времени выполнения (по крайней мере для RTL), чтобы приложение и пакет совместно использовали память менеджеров.

Включение «Использовать пакеты времени выполнения» и добавление «rtl» в список пакетов решило проблему. Спасибо вам всем за помощь.

...