Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 510

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Моя проблема заключается в следующим. Используется в программе достаточно большое колличество библиотек, сейчас встал вопрос об уменьшении размера, как и дистрибутива, так и самой программы в памяти. При установлении галочки Build with runtime packages, больше чем у одной библиотеки, приводит к ошибки(чтения памяти) в момент выгрузки приложения, конкретно когда начинают выгружаться пакеты, или при повторной загрузки пакетов. Ругается в бплки rtl100

Приложение:
  1.  


Серёга Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Серёга (статус: Посетитель)
Вопрос отправлен: 12 марта 2009, 14:21
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 10; последнее сообщение — 13 марта 2009, 12:43; участников в обсуждении: 3.
Вадим К

Вадим К (статус: Академик), 12 марта 2009, 14:49 [#1]:

Вижу две проблемы. Используется работа с string, который передаётся между библиотеками. До перехода просто везло (бывает так).
Второе - библиотеки используют разные менеджеры памяти. FastMM4/ShareMem нигде не числиться в uses?
Галочка "подтверждения прочтения" - вселенское зло.
Серёга

Серёга (статус: Посетитель), 12 марта 2009, 15:06 [#2]:

С FastMM4 и ShareMem пробывал, ситуация такаяже, правда я пробывал их указывать только в библиотеках, насколько я понимаю менеджеры памяти должны быть везде одинаковый, и в самой программе и в подгружаемых библиотеках? Скорей всего везде используется стандартный.
Вадим К

Вадим К (статус: Академик), 12 марта 2009, 15:23 [#3]:

ключевая фраза "правда я пробывал их указывать только в библиотеках".
И в главном приложении тоже должен быть такой же! Если хотя бы одна библиотека будет работать по другому и Вы будете передавать string, объекты, динамические массивы - будут проблемы.
Галочка "подтверждения прочтения" - вселенское зло.
Серёга

Серёга (статус: Посетитель), 12 марта 2009, 15:36 [#4]:

Проблеммы собственно уже есть, сейчас занимаю узнаванием где какой менеджер памяти использовался. Для использования Build with runtime packages насколько необходимо использование FastMM4 или ShareMem?
Вадим К

Вадим К (статус: Академик), 12 марта 2009, 15:56 [#5]:

начиная с 2006 (а может и с 2005, не могу навернека утверждать), FastMM уже является менеджером памяти по умолчанию.
использование/не использование Build with runtime packages не является определящим в этой ситуации. Важным есть то, используете ли вы dll. А bpl, если только особо не извратиться, позволяют передавать между собой и главным процессом даже объекты.
Опишите структуру приложения и что между отдельными частями передаётся, а то гадать будем тут ещё долго.
Галочка "подтверждения прочтения" - вселенское зло.
Ученый

Ученый (статус: 8-ой класс), 12 марта 2009, 16:04 [#6]:

У меня как-то была точно такая же проблема, выкидывало ошибку при закрытии.....причиной оказалось то, что я передавал из библиотеки строки..... вы случаем их не передаете?
Вадим К

Вадим К (статус: Академик), 12 марта 2009, 16:19 [#7]:

to Ученый
А я о чем тут толкую:)?
to Серёга
Если ничего не будет получаться, то можно воспользоваться двумя старыми проверенными способами - логирование и деление попалам.
Второй способ - это коментирование кода (с отключением функциональности) до тех пор, пока не исчезнет ошибка. В конце концов обычно приходят к 2-3 строкам, которые её и творят.
Галочка "подтверждения прочтения" - вселенское зло.
Серёга

Серёга (статус: Посетитель), 12 марта 2009, 16:39 [#8]:

Строки вроде как не передаются, хотя на 100% не знаю :-( Над программой работают несколько человек, библиотеки написанные как на Delphi так и на C (dll,ocx). Bpl в основном стандартные, своих нет.
Серёга

Серёга (статус: Посетитель), 13 марта 2009, 12:28 [#9]:

Как выяснилось строки всетаки передаются. Только вот в чем разница для этого, между установленной и снятой галочкой Build with runtime packages, если она не установлена то все прекрасно работает, но весит много, а если галочку поставить, то как и ожидается, весит мало, но вот и не работает. И если передаются строки то не должноли не работать в обоих случаях?
Вадим К

Вадим К (статус: Академик), 13 марта 2009, 12:43 [#10]:

В программировании есть такое понятию UB. Дословный перевод с английского этого сокращения - "неопределённое поведение". То есть, как будет вести себя программа, если в коде есть UB незвестно. Благое дело, что в языке паскаль/дефли таких UB очень мало. А вот в С++ их целая куча. То есть, есть код, он компилируется и даже работает, но как оно скомпилируется, зависит от настроения компилятора. классический пример i = i++ + ++i;
В данном случае передача string через границу dll и есть этим UB. То есть, Вам просто везло.
Первое, что надо убедиться, что все части системы используют одну и ту же версию библиотеки для работы с памятью. Во вторых, убедиться, что все объекты удаляются там, где создаются.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 16:27
Выполнено за 0.02 сек.