![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Ako |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 6.4.2004 Репутация: нет Всего: нет |
Всем привет! Хотел создать расширение MFC, в котором будет располагаться оконый класс: работа сним должна быть эквивалентна работе, например, с CListBox. При помощи AppWizard создал Extension DLL, в котором создал класс, базирующийся на оконном классе CStatic. При вызове деструктора класса из основной программы возникает сообщение об ошибке (указывается адрес, по которому расположен указатель this класса из Extension DLL). Не могу справиться с уничтожением класса.
Это сообщение отредактировал(а) Ako - 6.4.2004, 15:33 |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
скомпилируй в Release, ошибка исчезнет.
|
|||
|
||||
| Ako |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 6.4.2004 Репутация: нет Всего: нет |
Спасибо! Но я не понимаю, в чем прикол! Я создал просто пустой класс, основанный на CStatic, в котором кроме конструктора и деструтора НИЧЕГО нет! Конечно, существует DllMain() со всей необходимой информацией (это стандарт AppWizard). Однако, более ничего в этой Dll нет, а по всей видимости я разрушая что-то в памяти. Все равно, спасибо!
|
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Ты всё правильно делаешь. Прикол в MSVC++ Вкратце: То, что создано в DLL должна разрушать DLL. Что создано в программе, должна разрушать программа. (Так считают мелкомягкие создатели MSVC++ и наши мнения тут расходятся) Полностью: Как известно, каждый раз когда мы вызываем new или malloc, указатель на отделённый системой участок памяти помещается в стек. При попытке деструкции, программа проверяет, существует ли указатель на разрушаемый участок в этом стеке. Если указателя там нет, то выдаётся ошибка (То есть система исходит из того, что мы пытаемся разрушить что то, чего не создавали и правильно делает). Теперь сам прикол: MSVC++ по умолчанию создает два таких стека, один непосредственно для программы, а другой для динамической библиотеки (Я не знаю, находит ли кто нибудь такую систему полезной). Понятно тогда, что то, что было создано в DLL программа разрушить не сможет, так как указателя в локальном стеке самой программы не существует. Попробуй запустить программу дебагером и увидишь, о чём я говорю. Выходы из ситуации
Удачи! Сергей |
|||
|
||||
| Ako |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 6.4.2004 Репутация: нет Всего: нет |
Сергей, спасибо за помощь! Я попробывал сделать Release Dll, как Вы и говорили. Смотрю отладчиком из вызывающей программы, что происходит. При вызове delete теперь все в порядке: сообщений никаких нет. Однако, в окне отладки я вижу, что мой класс Dll не удален: Detected Memory Licks!!! Я внимательно обдумаю Ваше повторное сообщение: оно многое проясняет. Прошу Вас сказать мне, должен ли я в деструкторе своего класса вставить delete this или нет (я уже запутался в трех соснах, но точно что-то не удаляю за собой[/s]). Еще раз спасибо! Завтра с утра буду рад еще раз встретиться с Вами и Вашими советами!. Спасибо.
|
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Нет! Такого вообще нельзя делать. Осмелюсь предположить, что деструкция проходит, но дибаггер не замечает этого. Попробуйте распечатать деструкцию с помщью MessageBox'a. К сожалению я не понял, как и где именно происходит конструкция и деструкция обьекта. Работаете ли Вы c указателем или непосредственно с обьектом (при последнем деструктор и конструктор могут вызываться например при переложеном обераторе '=' ). |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |