Hardshared-ptrenable-shared-from-this
Что такое enable_shared_from_this и когда он нужен?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
Когда объект управляется через shared_ptr, иногда изнутри метода нужно вернуть shared_ptr на this. Но shared_ptr<T>(this) создаёт новый control block — двойное удаление. Решение: наследоваться от enable_shared_from_this<T>.
class Worker : public std::enable_shared_from_this<Worker> {
public:
void start() {
// НЕЛЬЗЯ: std::shared_ptr<Worker>(this) — новый control block!
schedule(shared_from_this()); // делит существующий control block
}
};
auto w = std::make_shared<Worker>();
w->start(); // OK — объект уже под shared_ptrМеханика: при первом создании shared_ptr от объекта сохраняется weak_ptr на существующий control block, а shared_from_this() lock-ает его.
Ограничение: shared_from_this() можно вызывать только если объект уже управляется shared_ptr (иначе UB). Полезно для асинхронных обработчиков, callback-ов.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.