Информация об изменениях

Сообщение Re[6]: Как удаляется vptr? от 11.04.2023 9:39

Изменено 11.04.2023 9:41 avovana

Re[6]: Как удаляется vptr?
Здравствуйте, rg45, Вы писали:

R>Ну для начала я бы уточнил у интервьюера, какой смысл он вкладывает в выражение "vptr утечет". Если мы считаем, что vptr — это просто указатель, то как он может утечь? "Течет" память, выделенная под данные, на которые указывает укажатель. А указатель — это просто переменная, расположенная внутри объекта, в которой хранится адрес. Утечь она может только вместе с памятью, выделенной под объект.


R>Потом, как я уже писал, выражение delete base порождает неопределенное поведение. Что произойдет дальше, не знает никто — в этом суть неопределенного поведения. Что куда утечет — об этом можно только фантазировать.


К примеру SaZ предложил вариант, что этот указатель будет создан левее объекта.
Как понял, у него такое удаление delete base не ub. Т.к. delete будет знать, что надо и этот vptr который левее удалить.
Вы говорите, что это ub. Можно тогда представить ситуацию, что реализация как описал SaZ, но вот поскольку вы говорите, что это ub, то delete base не заглянет для удаления в память левее объекта, где лежит этот vptr. И удалит лишь объект? Тогда те 8 байт останутся. А оперировать далее будет памятью после этих 8ми байт — т.е. пустым местом объекта после его удаления. Создаём, к примеру, новый объект. Снова 8 байт + объект. Плохо удаляем — delete base. Снова удалится только объект. Т.к. вы сказали что это ub. Вот такое ub к примеру — плохо подчищается память. Не удалился vptr. Итого уже 8,8байт|пустое место для нового объекта. Может быть такая реализация ub?
Вот и "течёт" указатель. Но течёт из-за такого варианта ub — плохо подчистили объект.
Re[6]: Как удаляется vptr?
Здравствуйте, rg45, Вы писали:

R>Ну для начала я бы уточнил у интервьюера, какой смысл он вкладывает в выражение "vptr утечет". Если мы считаем, что vptr — это просто указатель, то как он может утечь? "Течет" память, выделенная под данные, на которые указывает укажатель. А указатель — это просто переменная, расположенная внутри объекта, в которой хранится адрес. Утечь она может только вместе с памятью, выделенной под объект.


R>Потом, как я уже писал, выражение delete base порождает неопределенное поведение. Что произойдет дальше, не знает никто — в этом суть неопределенного поведения. Что куда утечет — об этом можно только фантазировать.


К примеру SaZ предложил вариант, что этот указатель будет создан левее объекта.
Как понял, у него такое удаление delete base не ub. Т.к. delete будет знать, что надо и этот vptr который левее удалить.
Вы говорите, что это ub. Можно тогда представить ситуацию, что реализация как описал SaZ, но вот поскольку вы говорите, что это ub, то delete base не заглянет для удаления в память левее объекта, где лежит этот vptr. И удалит лишь объект? Тогда те 8 байт останутся. А оперировать далее будет памятью после этих 8ми байт — т.е. пустым местом объекта после его удаления. Создаём, к примеру, новый объект. Снова 8 байт + объект. Плохо удаляем — delete base. Снова удалится только объект. Т.к. вы сказали что это ub. Вот такое ub к примеру — плохо подчищается память. Не удалился vptr. Итого уже 8,8байт|пустое место для нового объекта. Может быть такая реализация ub?
Вот и "течёт" указатель. Но течёт из-за такого варианта ub — плохо подчистили память, выделенную под объект.