Вступить в клуб →
средняявопросПамять и RAII

Два объекта держат shared_ptr друг на друга

В сетевом сервисе соединение и его сессия ссылаются друг на друга:

struct Session;

struct Connection {
    std::shared_ptr<Session> session;
    ~Connection() { log("connection destroyed"); }
};

struct Session {
    std::shared_ptr<Connection> conn;
};

После закрытия соединения сервис перестаёт печатать connection destroyed, а потребление памяти растёт весь день. Что происходит и как чинить?

  • `shared_ptr` освобождает память отложенно: деструктор вызовется при следующем всплеске нагрузки, когда аллокатор решит вернуть страницы системе
  • Не хватает виртуального деструктора у `Connection`, из-за этого объект не разрушается
  • Счётчик ссылок ломается из-за нескольких потоков, помогут `std::atomic` вокруг обоих указателей
  • Циклические ссылки: счётчики никогда не доходят до нуля, одну из связей нужно сделать `std::weak_ptr`

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела