Czy std :: weak_ptrs wpływa na dealokację pamięci przydzielonej przez std :: make_shared?
Jeśli zadzwonięstd::make_shared<T>
(zamiast tylko przydzielaćshared_ptr<T>
jawnie), a następnie oczekuję, że liczba referencji zostanie przydzielona w pamięci obok instancji T, ze względu na wydajność. Wszystko dobrze i dobrze.
Ale jeśli mamweak_ptr
instancje odwołujące się do tego samego obiektu, prawdopodobnie będą potrzebować dostępu do tej liczby referencyjnej, aby wiedzieć, czy obiekt nadal istnieje.
Tak więc, gdy ostatni shared_ptr do instancji T zostanie zniszczony, naiwne zrozumienie systemu oznaczałoby, że nie może zwolnić pamięci, w której T jest przechowywany, ponieważ słabe_ptry nadal wymagają dostępu do tej liczby.
Wygląda na to, że jestoddzielny słaby licznik referencyjny i teoretycznie może być trzymany oddzielnie od instancji T, tak że T może zostać zniszczony, a pamięć zwolniona, podczas gdy słabe odniesienia wciąż istnieją. Ale potem wracamy do posiadania 2 oddzielnych alokacji, udaremniających korzyścimake_shared
.
Zakładam, że coś tu nie rozumiem. W jaki sposób pamięć przydzielona dla instancji skonstruowana przezstd::make_shared
uwolnić się, gdy istnieją słabe odniesienia?