C++/Zarządzanie pamięcią: Różnice pomiędzy wersjami

weak_ptr - poprawa opisu użycia
(+inteligentne wskaźniki)
(weak_ptr - poprawa opisu użycia)
Jeśli to możliwe należy nie dopuszczać do tworzenia cykli, bo jak widzimy prowadzi to do kłopotów. Pół biedy kiedy jesteśmy ich świadomi, ale gdy taki cykl powstanie przypadkowo, trudniej będzie dojść przyczyny wycieków.
 
Kiedy jednak cykle są nie do uniknięcia można użyć klasy <tt>weak_ptr</tt>, która również trzyma wskaźnik do obiektu, jednak nie wpływa na licznik referencji, mówi się, że "przerywa" cykl. Nie istnieje też możliwość dereferencji tego wskaźnika, należy tymczasowo skonwertować <tt>weak_ptr</tt> na <tt>shared_ptr</tt>, który podtrzyma przy życiu obiekt - robi to metoda <tt>lock</tt>. Instancja <tt>weak_ptr</tt> może istnieć dłużej niż wskazywany obiekt, dlatego konieczne jest stwierdzenie, czy obiekt jest jeszcze ważny - służy do tego funkcja <tt>expired</tt>.
 
Wzorce użycia tej klasy są dwa, można albo 1) najpierw testować metodą <tt>expired</tt>, a następnie użyć <tt>lock</tt>, albo 2) prościej od razu użyć <tt>lock</tt>, sprawdzając czy wynikowy wskaźnik nie będzie pusty.
 
<source lang="cpp">
// ...
 
// 1)
if (!wp.expired()) {
auto shared = wp.lock();
}
 
// 2)
if (auto shared = wp.lock()) {
// tu działania na shared
2

edycje