enable_shared_from_this<> и удаление наследников
От: niXman Ниоткуда https://github.com/niXman
Дата: 28.09.16 08:24
Оценка:
привет!

имея такой код:
struct session: std::enable_shared_from_this<session> {};

вполне понятно что будет вызван деструктор session.
но а что произойдет, если session унаследовать в user_context ?
struct user_context: session {};

будет ли вызван деструктор user_context, ведь enable_shared_from_this ничего не знает про наследников session?
и если будет, то почему/как?

спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 28.09.2016 8:24 niXman . Предыдущая версия .
Re: enable_shared_from_this<> и удаление наследников
От: szag  
Дата: 28.09.16 08:32
Оценка: +2 -1
Здравствуйте, niXman, Вы писали:

X>привет!



X>будет ли вызван деструктор user_context, ведь enable_shared_from_this ничего не знает про наследников session?

X>и если будет, то почему/как?

X>спасибо.


ИМХО, тут все точно так же как и при обычном наследовании и использовании указателя на базовый класс — нужен виртуальный деструктор, а иначе UB. Сам по себе enable_shared_from_this не делает виртуальных деструкторов.
Re[2]: enable_shared_from_this<> и удаление наследников
От: uzhas Ниоткуда  
Дата: 28.09.16 09:24
Оценка: +3
Здравствуйте, szag, Вы писали:

S>ИМХО, тут все точно так же как и при обычном наследовании и использовании указателя на базовый класс — нужен виртуальный деструктор, а иначе UB. Сам по себе enable_shared_from_this не делает виртуальных деструкторов.


ну почему же
здесь вполне может быть все интереснее

struct user_context: session {};
shared_ptr<session> p(new user_context()); // deleter is captured here, he knows real type is user_context


мы ведь помним, что shared_from_this() работает только после того, как объект уже положили в некоторый shared_ptr и там же уже сидит некоторый deleter. если deleter не приводит к UB, то все окей
вопрос (или ответ) в целом никак не связан с наследованием от std::enable_shared_from_this
Отредактировано 28.09.2016 9:30 uzhas . Предыдущая версия .
Re[3]: enable_shared_from_this<> и удаление наследников
От: szag  
Дата: 28.09.16 10:47
Оценка:
Здравствуйте, uzhas, Вы писали:

U>мы ведь помним, что shared_from_this() работает только после того, как объект уже положили в некоторый shared_ptr и там же уже сидит некоторый deleter. если deleter не приводит к UB, то все окей

U>вопрос (или ответ) в целом никак не связан с наследованием от std::enable_shared_from_this

согласен, если нигде не будет перехода на raw pointer, то будет работать и без виртуального деструктора, но я бы сделал деструктор session виртуальным и спал спокойно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.