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)
Обратите внимание на
будет использоватьсяТак что нефиг юзать то, что, возможно, еще не до конца реализовано
и уж тем более высказываться настолько грубо.