2010-02-22 1 views
2

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

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

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

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

EDIT BTW, есть ли лучший способ проверить, используется ли тот же менеджер памяти, что и сравнение состояния диспетчера памяти? TMemoryManager оказывается записью, поэтому я не могу сравнивать адреса.

+0

Они по умолчанию. Какую версию Delphi вы используете? –

+0

Я использую D2010. – jpfollenius

+0

HOw вы загружаете упаковку? Динамически или нет? Скомпилировано ли приложение с помощью «Использовать пакеты времени выполнения»? – 2010-02-22 12:53:30

ответ

1

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

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

4

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

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

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

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

+0

Да, предполагая, что программа построена с пакетами времени выполнения и ссылками rtl в параметрах проекта, а сам пакет требует rtl.dcp. Это по умолчанию, но его можно изменить. –

+0

Интересный пункт TOndrej. Не знал, что это возможно. Спасибо –

+0

Но @Tondrej, если вы все это делаете, разве вы в значительной степени не сломали все остальное в своей программе? Я думаю, что Смашер продемонстрировал именно это. –