| 
| 
 | Вопрос # 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. То есть, Вам просто везло.
 Первое, что надо убедиться, что все части системы используют одну и ту же версию библиотеки для работы с памятью. Во вторых, убедиться, что все объекты удаляются там, где создаются.
 Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |