![]() |
|
![]() ![]() ![]() |
|
deniska |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: 1 Всего: 0 |
Добрый день. В процессе работы наткнулся вот на какие грабли:
такой код вызывает утечку памяти. Долго не доходили руки пофиксить данную "фичу". Тут стал разбираться и возник вот какой вопрос: правильно ли я понял, что в чистом виде RTTI не используется в MFC, а для этого создан "прородитель" CObject для основных MFC классов. Если это так, то почему? Что в MFC классах такого особенного? и еще: настройки проекта на UNICODE/MULTI-BYTE должны влиять на возвращаемые данные от typeid? ЗЫ. код с вытаскиванием имени через
утечек не вызывает. Это сообщение отредактировал(а) deniska - 6.4.2011, 13:12 |
||||
|
|||||
RastaDja |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 337 Регистрация: 1.11.2010 Репутация: нет Всего: 5 |
Что-то мне кажется ты чего-то не дописал (подсчитай скобки и напиши то, что пропустил) -------------------- The more closely you look at one thing, the less closely can you see something else. |
|||
|
||||
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: 1 Всего: 0 |
спс, в первом топике поправил. Только не в этом то суть. сам вызов
приводит к утечке |
|||
|
||||
RastaDja |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 337 Регистрация: 1.11.2010 Репутация: нет Всего: 5 |
здесь дело может быть в том, что typeid(this).name() возвращает char*, что требует выделение памяти.
Попробуйте так
Это сообщение отредактировал(а) RastaDja - 6.4.2011, 13:26 -------------------- The more closely you look at one thing, the less closely can you see something else. |
|||
|
||||
deniska |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: 1 Всего: 0 |
![]()
Это сообщение отредактировал(а) deniska - 6.4.2011, 13:45 |
||||
|
|||||
RastaDja |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 337 Регистрация: 1.11.2010 Репутация: нет Всего: 5 |
вот у меня такой код
не вызывает утечек. Может это зависит от версии VS (у меня 2010) Добавлено через 11 минут и 56 секунд https://connect.microsoft.com/VisualStudio/...e-typeinfo-name -------------------- The more closely you look at one thing, the less closely can you see something else. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Просто MFC сильно старше, чем введение RTTI в стандарт, вот и реализовали его сами... А нынче остается для совместимости. Кроме того, MCF-шная реализация поддерживает доп. фичи - RuntimeClass и DynCreate, чтоб во многих случаях удобно. Можно смешивать, не вопрос. Мне кажется, что утечка у тебя по другой причине. Кроме того, если уж имеешь MFC-класс, то тип лучше проверять по-другому: IsKindOf (RUNTIME_CLASS (CSomeDlg)) -> здесь сравниваться будут указатели, а не строки. А если хочешь независимо от MFC, то так: dynamic_cast <CSomeDlg*>(this) != 0 Кроме того, сама по себе проверка типа наводит на подозрения о неудачном дизайне. -------------------- ... |
|||
|
||||
deniska |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: 1 Всего: 0 |
про стандартные типы я и не говорю, там все ОК. вместо стандартного попробуй поставить указатель на экземпляр класса своего MFC окна.
ну об этом я подумал первым делом, долго ломал голову, плюнул и создал пустой диалоговый проект, кинул в обработчик кнопки вышеуазанный код - эффект остался. поэтому и сделал я вывод о том, что MFC классы как-то не дружат со стандартным RTTI... насчет каст-операторов - согласен, можно и через них, не вопрос, просто понять хочу в чем реальная причина утечки. Если причина в моем коде - естессна надо устранять источник. ну и
![]() |
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
в приведенном выше коде нет, и не может быть... |
|||
|
||||
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: 1 Всего: 0 |
кстати, тут усомнился и попробовал код RastaDjaы, то есть RTTI на простых типах...
это я int переменную проверил... ![]() попробовал консольное приложение - там со стандарнтыми типами работает нормально. В чем может быть проблема? Менеджер ресурсов ложно срабатывает? Тогда почему только у меня на 2-студиях (2005, 2008)? Это сообщение отредактировал(а) deniska - 6.4.2011, 16:18 |
|||
|
||||
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: 1 Всего: 0 |
Может у кого есть какие-то мысли по вышеописанному?
|
|||
|
||||
voov |
|
|||
![]() Патамушта мы пилоты ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 29.11.2007 Репутация: 8 Всего: 8 |
Это проблема далеко не новая и хорошо известная разработчикам майкрософт.
Реальной утечки вызов typeid() не дает. Однако, менеджер памяти ошибочно выводит сообщение об утечке. Ничего критического для программы в этом нет, но сообщение здорово мозолит глаза. Проблема известна несколько лет, но так и не была решена (по крайней мере до выхода 10й студии). Информация была где-то на сайте майкрософт. У меня была аналогичная ситуация довольно давно. Увидел сообщение об утечке, начал копать и нашел эту информацию. Поначалу успокоился и оставил как есть, но позже все же переделал код, так как сообщение об утечке, даже ошибочное, очень напрягает. |
|||
|
||||
deniska |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: 1 Всего: 0 |
voov, вот спасибо, успокоил. Хотя код я тоже уже переделал, чтоб глаза не мозолил.
|
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |