|
Вопрос # 2 510/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Моя проблема заключается в следующим. Используется в программе достаточно большое колличество библиотек, сейчас встал вопрос об уменьшении размера, как и дистрибутива, так и самой программы в памяти. При установлении галочки Build with runtime packages, больше чем у одной библиотеки, приводит к ошибки(чтения памяти) в момент выгрузки приложения, конкретно когда начинают выгружаться пакеты, или при повторной загрузки пакетов. Ругается в бплки rtl100
 |
Вопрос задал: Серёга (статус: Посетитель)
Вопрос отправлен: 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. То есть, Вам просто везло.
Первое, что надо убедиться, что все части системы используют одну и ту же версию библиотеки для работы с памятью. Во вторых, убедиться, что все объекты удаляются там, где создаются.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|