Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Extension DLL, Проблемы в создании своего класса 
:(
    Опции темы
Ako
  Дата 6.4.2004, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 6.4.2004

Репутация: нет
Всего: нет



Всем привет! Хотел создать расширение MFC, в котором будет располагаться оконый класс: работа сним должна быть эквивалентна работе, например, с CListBox. При помощи AppWizard создал Extension DLL, в котором создал класс, базирующийся на оконном классе CStatic. При вызове деструктора класса из основной программы возникает сообщение об ошибке (указывается адрес, по которому расположен указатель this класса из Extension DLL). Не могу справиться с уничтожением класса. baaa.gif

Это сообщение отредактировал(а) Ako - 6.4.2004, 15:33
PM MAIL   Вверх
sergejzr
Дата 6.4.2004, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



скомпилируй в Release, ошибка исчезнет.



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Ako
Дата 6.4.2004, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 6.4.2004

Репутация: нет
Всего: нет



Спасибо! Но я не понимаю, в чем прикол! Я создал просто пустой класс, основанный на CStatic, в котором кроме конструктора и деструтора НИЧЕГО нет! Конечно, существует DllMain() со всей необходимой информацией (это стандарт AppWizard). Однако, более ничего в этой Dll нет, а по всей видимости я разрушая что-то в памяти. Все равно, спасибо! rolleyes.gif
PM MAIL   Вверх
sergejzr
Дата 6.4.2004, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Цитата
... а по всей видимости я разрушая что-то в памяти...


Ты всё правильно делаешь. Прикол в MSVC++

Вкратце:
То, что создано в DLL должна разрушать DLL.
Что создано в программе, должна разрушать программа.
(Так считают мелкомягкие создатели MSVC++ и наши мнения тут расходятся)

Полностью:
Как известно, каждый раз когда мы вызываем new или malloc, указатель на отделённый системой участок памяти помещается в стек. При попытке деструкции, программа проверяет, существует ли указатель на разрушаемый участок в этом стеке. Если указателя там нет, то выдаётся ошибка (То есть система исходит из того, что мы пытаемся разрушить что то, чего не создавали и правильно делает).
Теперь сам прикол: MSVC++ по умолчанию создает два таких стека, один непосредственно для программы, а другой для динамической библиотеки (Я не знаю, находит ли кто нибудь такую систему полезной). Понятно тогда, что то, что было создано в DLL программа разрушить не сможет, так как указателя в локальном стеке самой программы не существует.
Попробуй запустить программу дебагером и увидишь, о чём я говорю.
Выходы из ситуации
  • копилировать в релиз . или..
  • Изменить установки MSVC++: Project Settings->Таб С/С++-> Category: Code generation -> Use runtime library: Debug Multithreaded DLL

Удачи!
Сергей


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Ako
Дата 6.4.2004, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 6.4.2004

Репутация: нет
Всего: нет



Сергей, спасибо за помощь! Я попробывал сделать Release Dll, как Вы и говорили. Смотрю отладчиком из вызывающей программы, что происходит. При вызове delete теперь все в порядке: сообщений никаких нет. Однако, в окне отладки я вижу, что мой класс Dll не удален: Detected Memory Licks!!! Я внимательно обдумаю Ваше повторное сообщение: оно многое проясняет. Прошу Вас сказать мне, должен ли я в деструкторе своего класса вставить delete this или нет (я уже запутался в трех соснах, но точно что-то не удаляю за собой[/s]). Еще раз спасибо! Завтра с утра буду рад еще раз встретиться с Вами и Вашими советами!. Спасибо. smile.gif
PM MAIL   Вверх
sergejzr
Дата 7.4.2004, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Цитата
..должен ли я в деструкторе своего класса вставить delete this..

Нет! Такого вообще нельзя делать.
Осмелюсь предположить, что деструкция проходит, но дибаггер не замечает этого. Попробуйте распечатать деструкцию с помщью MessageBox'a.

К сожалению я не понял, как и где именно происходит конструкция и деструкция обьекта. Работаете ли Вы c указателем или непосредственно с обьектом (при последнем деструктор и конструктор могут вызываться например при переложеном обераторе '=' ).



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0470 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.