Переключение на Главную Страницу Страницы: 1 2 3 [4] 5  ОтправитьПечать
Очень популярная тема (более 25 ответов) Ошибка наследования или проблемы ИТЗ? (число прочтений - 15108 )
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Ошибка наследования или проблемы ИТЗ?
Ответ #45 - 27. Февраля 2008 :: 10:58
Печать  
Uzhast писал(а) 27. Февраля 2008 :: 10:54:
Мужики, хватит уже, вы мне плохой пример подаете  Очень довольный

Держись, брат. Подмигивание
Но помни, от того, удастся ли мне доказать правду, зависит, будешь ли ты работать над проектом или над такими "ошибками".
  

De quelle planète es-tu?
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка наследования или проблемы ИТЗ?
Ответ #46 - 27. Февраля 2008 :: 11:03
Печать  
Uzhast писал(а) 27. Февраля 2008 :: 10:43:
Итак, в чем отличие объекта с виртуальными функциями от обычного объекта? У объекта с виртуальными функциями первый член данных - это vfptr. vfptr - это адрес блока адресов виртуальных функций (vtable).

Что происходит в коде RefreshGroupContextData? Вызов delete [] m_pMyVTable. Если я правильно понял, это переопределенная таблица адресов виртуальных функций для "похаченных" в TurboBL контекстов. Далее в функции Boost, если таблица адресов была удалена (или еще не была создана), она создается и инициализируется.

Не совсем уверен, как происходит на самом деле, но в худшем случае будет следующее. Если на момент вызова delete [] m_pMyVTable уже существовало несколько контекстов, использующих эту vtable, то после вызова delete эти существующие контексты вылетят в космос. Потому что, сколько объектов, столько и будет существовать vfptr. Т.к. vtable удалена, то все эти vfptr указывают на удаленную память, которая может быть задействована в ближайшем выделении памяти и заполнена совершенно левыми значениями.

Правильно я понял?

Нет, Олег, не совсем правильно.
Ты же сам пишешь, что "vfptr - это адрес блока адресов виртуальных функций". Самое главное здесь то, что это блок адресов.
Т.е. если мы удаляем саму vfptr, сами адреса не удаляются.
Далее в функции Буст мы заново заполняем vfptr этими же адресами.
И в этой схеме нет ничего страшного, если учтены все детали.

Но, вполне может быть, что я как раз и не учел все детали - например, где-то внутри ТурбоБл обращение к методам контекста Печаль

ЗЫ между прочим, я нигде не писал и не говорил, что RefreshGroupContextData уже готовый к использованию метод.
Ни в 1С++, ни в ФормЕкс нет его использования.
Самый главный баг в нем на момент последней моей правки этого метода, т.е. довольно давно - это то, после его применения в некоторых случаях, которых я уже не помню (где-то в тестах есть), дублируются методы - т.е. таблица методов становится больше Печаль
На работу это не влияет вроде бы, но выглядит некрасиво.
Времени разобраться не хватило, так и оставил.

Вот прямая цитата из кода
Цитата:
// обновление данных контекста будет использоваться, например, при
// динамическом добавлении атрибутов на форму
void CGCBoost::RefreshGroupContextData(CGroupContext* pGroupContext)

Обратите внимание на будет использоваться

Так что нефиг юзать то, что, возможно, еще не до конца реализовано Улыбка и уж тем более высказываться настолько грубо.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка наследования или проблемы ИТЗ?
Ответ #47 - 27. Февраля 2008 :: 11:07
Печать  
kms писал(а) 27. Февраля 2008 :: 10:52:
artbear писал(а) 27. Февраля 2008 :: 10:49:
А команда - она и есть команда, чтобы совместно их исправлять.

Нет.
У меня другие представления о команде.

Как раз у тебя нет представления работы в команде.
Ты просто не командный игрок 100%
В качестве примера расскажи, в каких командах ты работал и что реализовывал?
Я навскидку - 1С++, ФормЕкс, Фанктест - и это именно командные проекты.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Ошибка наследования или проблемы ИТЗ?
Ответ #48 - 27. Февраля 2008 :: 11:11
Печать  
artbear писал(а) 27. Февраля 2008 :: 11:03:
Нет, Олег, не совсем правильно.
Ты же сам пишешь, что "vfptr - это адрес блока адресов виртуальных функций". Самое главное здесь то, что это блок адресов.
Т.е. если мы удаляем саму vfptr, сами адреса не удаляются.
Далее в функции Буст мы заново заполняем vfptr этими же адресами.
И в этой схеме нет ничего страшного, если учтены все детали.

Есть два понятия:
vtable - блок адресов виртуальных функций
vfptr - адрес vtable.

delete удаляет память, где лежит vtable. vfptr для существующих объектов не меняется и указывает, таким образом, на удаленную память. Ведь vfptr для всех существующих объектов не заменяется на новый, так? Когда выделяется память под новую vtable она может как лечь на "старое" место - где раньше лежала наша vtable, так и на совершенно новое. При этом память от старой vtable может быть отдана при каком-нибудь другом выделении памяти. Соответственно адреса, лежащие в vtable будут затерты. Вызов виртуальной функции происходит при помощи vfptr: берем адрес таблицы, по индексу берем адрес функции и вызываем ее по полученному адресу. В результате будет вызов по неизвестному адресу с неизвестным результатом.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка наследования или проблемы ИТЗ?
Ответ #49 - 27. Февраля 2008 :: 11:16
Печать  
Uzhast писал(а) 27. Февраля 2008 :: 11:11:
Есть два понятия:
vtable - блок адресов виртуальных функций
vfptr - адрес vtable.

delete удаляет память, где лежит vtable. vfptr для существующих объектов не меняется и указывает, таким образом, на удаленную память. Ведь vfptr для всех существующих объектов не заменяется на новый, так?

Олег, не так.
Как раз vfptr для существующих объектов и заменяется на адрес новой таблицы Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Ошибка наследования или проблемы ИТЗ?
Ответ #50 - 27. Февраля 2008 :: 11:18
Печать  
artbear писал(а) 27. Февраля 2008 :: 11:16:
Олег, не так.
Как раз vfptr для существующих объектов и заменяется на адрес новой таблицы Улыбка

Где заменяется этот vfptr? В каком месте? Я так понимаю, каждый объект имеет свой vfptr. Значит, чтобы заменить vfptr, нужно обойти все эти объекты и в каждом из них исправить vfptr. В каком месте это происходит?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка наследования или проблемы ИТЗ?
Ответ #51 - 27. Февраля 2008 :: 11:19
Печать  
artbear писал(а) 27. Февраля 2008 :: 11:03:
Нет, Олег, не совсем правильно.
Ты же сам пишешь, что "vfptr - это адрес блока адресов виртуальных функций". Самое главное здесь то, что это блок адресов.
Т.е. если мы удаляем саму vfptr, сами адреса не удаляются.
Далее в функции Буст мы заново заполняем vfptr этими же адресами.
И в этой схеме нет ничего страшного, если учтены все детали.

Предложение
"Далее в функции Буст мы заново заполняем vfptr этими же адресами."
читать как
"Далее в функции Boost мы заново заполняем vfptr адресом на новый блок адресов виртуальных функций."

  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка наследования или проблемы ИТЗ?
Ответ #52 - 27. Февраля 2008 :: 11:22
Печать  
Uzhast писал(а) 27. Февраля 2008 :: 11:18:
Где заменяется этот vfptr? В каком месте? Я так понимаю, каждый объект имеет свой vfptr. Значит, чтобы заменить vfptr, нужно обойти все эти объекты и в каждом из них исправить vfptr. В каком месте это происходит?

Олег, ты kms не слушай.
Лучше код посмотри Улыбка и сам реши, кто прав, а кто виноват.
TurboBL\gcboost.cpp и h
методы CGCBoost::Boost и CGCBoost::RefreshGroupContextData
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Ошибка наследования или проблемы ИТЗ?
Ответ #53 - 27. Февраля 2008 :: 11:25
Печать  
artbear писал(а) 27. Февраля 2008 :: 11:22:
Олег, ты kms не слушай.
Лучше код посмотри Улыбка и сам реши, кто прав, а кто виноват.
TurboBL\gcboost.cpp и h
методы CGCBoost::Boost и CGCBoost::RefreshGroupContextData


Я этот код как раз сейчас и смотрю. Ты путаешь понятия vtable и vfptr. vtable у ряда объектов может быть совершенно одинакова. Потому что у этих объектов vfptr указывает на одинаковую vtable. Ты создаешь новую vtable, но vfptr всех существующих объектов указывает на старую, уже удаленную vtable. vfptr - это атрибут не класса, а конкретного объекта, его нельзя заменить правкой в одном месте. Потому что КАЖДЫЙ объект класса имеет СВОЙ vfptr. В том коде, что ты говоришь, нет обхода всех объектов и замены vfptr.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка наследования или проблемы ИТЗ?
Ответ #54 - 27. Февраля 2008 :: 11:50
Печать  
1. Повторюсь Печаль

ЗЫ между прочим, я нигде не писал и не говорил, что RefreshGroupContextData уже готовый к использованию метод.
Ни в 1С++, ни в ФормЕкс нет его использования.

2. Да, похоже, я все-таки Печаль не до конца продумал эту часть Печаль
А с другой стороны, читаем фразу выше и помним, что были только благие намерения, которые, как обычно, привели не к светлому будущему Улыбка

3. Значит, буду/будем ? искать другой подход к решению проблемы динамического обновления свойств и методов группового контекста.

4. kms с некоторых пор лично я уважать перестал и уже, похоже, никогда не начну уважать. Перестал уважать именно из-за его грубейшего поведения при общении с людьми.

Признаю его как знающего разработчика, но как человек он для меня никто. Считаю, что именно из-за подобных его действий/высказываний из нашего проекта ушло много людей.

Между прочим, он уже не один раз покидал наш проект.
Почему же он возвращается, если в проекте все так плохо, а?
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка наследования или проблемы ИТЗ?
Ответ #55 - 27. Февраля 2008 :: 13:35
Печать  
artbear писал(а) 27. Февраля 2008 :: 11:50:
Между прочим, он уже не один раз покидал наш проект.
Почему же он возвращается, если в проекте все так плохо, а?

Думаю тут не одна причина. Несмотря на то что у Миши много эмоций, он быстро остывает. Кроме того, есть желание "творить", слава богу в v7 такая возможность есть. Есть еще причины, почему люди до сих пор держаться проекта.

Давайте не будем раздувать огонь. И так уже обжигает...


P.S. Нет бы делом занимались, ей богу как дети малые Улыбка Тьфу-тьфу на ветку, поехал я пару склонов обкатаю, пока снег совсем не растаял.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Ошибка наследования или проблемы ИТЗ?
Ответ #56 - 27. Февраля 2008 :: 14:05
Печать  
artbear

Потеря уважения к кому бы то ни было, к сожалению, не восполнит недостатка подготовки и не добавит ответственности перед собой и другими.
Стремление браться за задачи, которые тебе не по силам, по прежнему будет требовать компенсации со стороны других людей.

С точки зрения DIR (Do-It-Right, такой технодайвинг) нам с тобой нельзя погружаться вместе.

Про командную работу не надо мне рассказывать сказки.
Я знаю, как люди живут и умирают в таких командах. Улыбка
  

De quelle planète es-tu?
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка наследования или проблемы ИТЗ?
Ответ #57 - 27. Февраля 2008 :: 14:09
Печать  
Опять вода, вода, вода Печаль
Все, умолкаю.
Иначе, правда, не очень красиво получается - ветку испортили Печаль
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка наследования или проблемы ИТЗ?
Ответ #58 - 27. Февраля 2008 :: 16:19
Печать  
Если нужна конкретика - пожалуйста.

Я вот до сих пор не могу однозначно определиться с твоей, Артур, ролью в проекте Functest. С одной стороны, ты написал много нужного функционала, а с другой стороны это породило большое количество трудносопровождаемого кода, который требует, да нет, просто кричит о том, что его надо причесать.

В вышеописанном несомненно есть и моя вина. Да нет, исключительно моя вина. Я - ведущий этого проекта, и мне отвечать за все, что там происходит. И наверное мне даже надо сказать тебе спасибо за то, что ты невольно открыл мне глаза на очень многое. Например на то, чем хороши патчи, и чем плохи отправки правленного проекта целиком.
  
Наверх
www  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Ошибка наследования или проблемы ИТЗ?
Ответ #59 - 28. Февраля 2008 :: 05:19
Печать  
Федор, хотя мне есть что ответить по Фанктесту,
раз я обещал молчать, буду молчать.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 3 [4] 5 
ОтправитьПечать