Если я вызываю std::make_shared<T>
(а не просто выделяя shared_ptr<T>
явно), то я ожидаю, что подсчет ссылок будет выделен в памяти вместе с экземпляром T по соображениям производительности. Все хорошо и хорошо.
Но если у меня есть экземпляры weak_ptr
, ссылающиеся на один и тот же объект, вероятно, им понадобится доступ к этому счету ссылок, чтобы узнать, существует ли объект еще.
Итак, когда последний shared_ptr для экземпляра T уничтожается, наивное понимание системы подразумевает, что он не может освободить память, в которой хранится T, потому что weak_ptr все еще требуют доступа к этому счету.
Кажется, что существует отдельный слабый счетчик ссылок, и теоретически это может быть проведено отдельно от экземпляра T, так что T может быть уничтожен, а память освобождается, а слабые ссылки все еще существуют. Но потом мы вернулись к двум раздельным распределениям, превзойдя преимущества make_shared
.
Я предполагаю, что я что-то не понимаю. Как можно освободить память, выделенную для экземпляра, построенного с помощью std::make_shared
, при наличии слабых ссылок?