Re[4]: Безопасно ли присваивать один указатель другому?..
От: antonio_banderas Россия  
Дата: 26.03.18 11:23
Оценка: 7 (1) +1
Здравствуйте, zou, Вы писали:

zou>Здравствуйте, okman, Вы писали:


zou>На стандарт ссылку не дам, но, думаю, суть в том, что при присваивании p2 = p1 происходит не просто копирование, а преобразование адреса, для которого требуется прочитать RTTI. Если адрес p1 невалидный, то при обращении к RTTI происходит исключение. В случае валидного адреса p1, переменная p2 будет содержать адрес с неким смещением.


Как раз примерно это же хотел ответить.
При обычном (невиртуальном) наследовании все смещения при "хождении" по иерархии классов (т.е. при преобразовании указателей в пределах иерархии наследования) известны во время компиляции.
А вот при виртуальном наследовании смещение во время компиляции уже неизвестно и его нужно взять из таблицы смещений (или как она называется), к которой обращаемся через vptr, а в случае мертвого объекта vptr уже невалиден. Отсюда и падение.
Отредактировано 26.03.2018 11:28 antonio_v_krasnom . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.