![]() |
|
![]() ![]() ![]() |
|
scroollocker |
|
|||
![]() .{--}. Профиль Группа: Участник Сообщений: 40 Регистрация: 17.9.2010 Репутация: нет Всего: нет |
Пишу джаббер клиент и столкнулся с неизвестной, и ранее мне не встречавшейся проблемой. При закрытии программы, возникает ошибка
прошелся в деббагер до этой ошибки, она оказалась в файле "GETMEM.INC". И что еще удивительно, это то, что при включении use dynamic RTL и отключенном runtime packages ошибка исчезает. Мистика или какая то изученная вещь? ![]() |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 18 Всего: 135 |
Второе. Отключение use dynamic RTL говорит компилятору включить менеджер памяти (ф-ции выделения и освобождения памяти) непосредственно в exe-шник (или dll-ку). Если exe-шник использует какие-либо dll-ки, которые собраны с флажком use dynamic RTL, то в программе получается 2 менеджера памяти - один внешний (borlandmm.dll), второй - вшитый в exe. Может возникнуть ситуация (а она, судя по всему и возникает), в которой один менеджер выделил память, а второй пытается освободить. Такое может быть и если в dll-ке отключен use dynamic RTL - всё равно 2 менеджера - один встроен в exe, другой - в dll. Короче, отключать use dynamic RTL можно только если у тебя простейшая helloWord'ная программа. Чуть сложнее - низя. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
scroollocker |
|
|||
![]() .{--}. Профиль Группа: Участник Сообщений: 40 Регистрация: 17.9.2010 Репутация: нет Всего: нет |
borisbn, то что изучено, это меня радует
![]() Но, Из всех наворотов использую только Борландовский TClientSocket. Кстати, после открытия соединения с сервером, и начала обмена информацией, если закрыть программу, вылетает эта ошибка. В итоге получается, что то в нем?
Получается, чтобы мне перенести программу на другой комп, надо в обязательном порядке тащить какие то доп. файлы? Вроде же, можно обойтись без этого? |
|||
|
||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 39 Всего: 64 |
Мне кажется, что вы пытаетесь обратиться к какому-то объекту во время разрушения формы.
Проверьте все свои деструкторы на наличие таких обращений. Так же, если вы переопределили оконную процедуру, то при обработке событий, лучше всё обернуть в:
Плюс, при закрытии формы, нужно останавливать все закачки и потоки (особенно те, из которых идёт обращение к VCL). Это сообщение отредактировал(а) artsb - 24.7.2011, 01:15 -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
||||
|
||||
scroollocker |
|
|||
![]() .{--}. Профиль Группа: Участник Сообщений: 40 Регистрация: 17.9.2010 Репутация: нет Всего: нет |
artsb,
Сейчас пробегусь по коду, проверю все еще раз. Может действительно допустил где то ошибку, портящую мне жизнь теперь. xvr,
А где смотреть? в "Call stack"? перед тем как действие перешло в getmem.inc? И еще, если например не делать ClientSocket->Open(); закрывается нормально, без ошибок. |
|||
|
||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 39 Всего: 64 |
Похоже, что у вас ClientSocket работает в отдельном потоке. И вы этот поток не останавливаете при закрытии формы. А в обработчиках ClientSocket, у вас идёт обновление какого-нибудь Label'а. И происходит так, что Label уже "умер", а поток пытается до него достучаться. Плюс проверьте обработчики событий ClientSocket. -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 14 Всего: 39 |
глупости все это. -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 18 Всего: 135 |
а вот такое заявление - без единого аргумента - не глупость ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 14 Всего: 39 |
это никак не влияет на AV
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
||||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 18 Всего: 135 |
когда один менеджер памяти удаляет память, выделенную в другом - может быть что угодно... у него элементарно для этого указателя в какой-нибудь своей таблице может быть прописан другой размер... Это сообщение отредактировал(а) borisbn - 25.7.2011, 17:49 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 14 Всего: 39 |
а такое происходит когда программер код через одно место сваял -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 18 Всего: 135 |
пример: основная программа передаёт в dll-ку свой TForm в качестве Parent'а и Owner'а. В dll-ке создаётся TFrame, который кладётся на Parent'а и делает его своим Owner'ом. По окончании программы Owner удаляет всех "детей", в том числе и того, который создан в dll. Если отключить use dynamic RTL, то в dll-ке память под TFrame выделит свой менеджер, а удалит его в основной программе - другой. При включенном же use dynamic RTL всё будет делать один манагер. Такой способ Ownership-ства - вполне стандартная вещь в VCL, и тот, кто его использует - вовсе не криворукий. Вот VCL-ю не мешало бы проверять, чтоб такой ситуации с двумя менеджерами не было в принципе. Не знаю как... в других системах ведь как-то проверяют -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 14 Всего: 39 |
если в dll создается объект, там он и должен быть уничтожен
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |