У меня есть иерархия классов следующим образом:
class BaseSession : public boost::enable_shared_from_this<BaseSession>
class DerivedSessionA : public BaseSession
class DerivedSessionB : public BaseSession
Внутри производных функций класса я регулярно вызываю такие функции:
Func(boost::dynamic_pointer_cast<DerivedSessionA>(shared_from_this()));
Поскольку я работал с shared_ptr
для управления сеансами, это работало нормально. Недавно я обнаружил, что мое использование shared_ptr
для этого случая не является оптимальным. Это потому, что эти сеансы - это одноэлементные объекты, которые поддерживают один сокет на каждого клиента. Если сокет снова подключен, копии сеанса стали зомби.
В качестве обходного пути я начал передавать shared_ptr
по ссылке, а не по копиям. Это решило проблему зомби.
В идеале я чувствовал, что должен использовать unique_ptr
для хранения сеанса, а затем передавать ссылки на другие функции. Это открыло целую банку червей.
Как сделать класс базового класса unique_ptr
объектом производного класса unique_ptr
? Что такое unique_ptr
версия следующей строки?
Func(boost::dynamic_pointer_cast<DerivedSessionA>(shared_from_this()));
Мне просто нужна одна копия объекта сеанса, все остальное должно быть ссылкой.