Два объекта держат 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`
