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 подскажет развёрнутый ответ в реальном времени.