Choć rozumiem, dlaczego nie ma operator==
dla shared_ptr
i unique_ptr
, zastanawiam się, dlaczego nie ma nikogo na shared_ptr
i weak_ptr
. Zwłaszcza, że można utworzyć weak_ptr
za pośrednictwem odnośnika na shared_ptr
. Założę się, że przez 99% czasu chcesz lhs.get() == rhs.get()
. Chciałbym teraz iść dalej i wprowadzić to do mojego kodu, chyba że ktoś może wskazać mi dobry powód, dlaczego nie powinienem robić czegoś takiego.Missing równość shared_ptr i weak_ptr
Odpowiedz
weak_ptr
nie ma metody get()
, ponieważ trzeba jawnie zablokować weak_ptr
, zanim będzie można uzyskać dostęp do podstawowego wskaźnika. Podkreślenie tego jest świadomą decyzją projektową. Jeśli konwersja była niejawna, bardzo łatwo byłoby napisać kod, który byłby niebezpieczny, gdyby ostatni obiekt shared_ptr
do obiektu miał zostać zniszczony, podczas gdy podstawowa wskazówka uzyskana z weak_ptr
była wciąż badana.
This boost page ma dobry opis pułapek i dlaczego weak_ptr
ma tak ograniczony interfejs.
Jeśli chcesz wykonać szybkie porównanie, możesz wykonać shared == weak.lock()
. Jeśli porównanie jest prawdziwe, to wiesz, że weak
musi być nadal ważny, ponieważ przechowujesz oddzielny shared_ptr
dla tego samego obiektu. Nie ma takiej gwarancji, jeśli porównanie zwróci wartość false.
Wywołanie 'blokady' dla większej części kodu naprawdę ma więcej sensu. Dobra decyzja dotycząca projektu. – abergmeier
Ponieważ ma to koszt.
A weak_ptr
jest jak obserwator, a nie prawdziwy wskaźnik. Aby wykonać z nim jakąkolwiek pracę, najpierw musisz uzyskać od niej numer shared_ptr
, używając metody lock()
.
To skutkuje nabyciem prawa własności, ale jest tak kosztowne, jak kopiowanie zwykłego shared_ptr
(przyrost zliczania, itp.), Więc nie jest to nic trywialnego.
Jako taka, nie podając ==
, jesteś zmuszony do cofnięcia się i faktycznie sprawdzić, czy naprawdę tego potrzebujesz, czy nie.
Nie jestem pewien, czy porównywanie potrzeb równości wymaga dbałości o ważność i jako takie mogłoby być realizowane tanio: albo "słabe_ptr" odnosi się do tego samego bytu, w którym to przypadku musi być ważne (albo 0), albo odnosi się do inny podmiot, w którym to przypadku nie obchodzi nas, czy jest ono ważne. –
@KonradRudolph: może, może nie. Ale ponieważ uzyskanie wskaźnika byłoby ogólnie niebezpieczne (ponieważ miałbyś wskaźnik, ale nie byłbyś w stanie uzyskać dostępu do pointee), nie możesz uzyskać wskaźnika z 'weak_ptr' i jesteś zmuszony przejść przez' shared_ptr'. Więc ... –
Nie, uzyskanie wskaźnika jest bezpieczne, o ile jest to zrobione * wewnętrznie *. –
- 1. porównaj równość obiektu shared_ptr
- 2. Posiadanie wektora weak_ptr, chcesz zwrócić wektor shared_ptr
- 3. Konwersja z polimorfizmu shared_ptr na weak_ptr
- 4. weak_ptr z klasy bazowej, podczas gdy shared_ptr jest klasy pochodnej?
- 5. Dlaczego std :: weak_ptr :: expired zoptymalizowano?
- 6. Dlaczego dzwonienie przez weak_ptr jest tak wolne?
- 7. Różnice między tr1 :: shared_ptr i boost :: shared_ptr?
- 8. kolejność sortowania boost :: weak_ptr after expiring?
- 9. Tworzenie weak_ptr <> z surowego wskaźnika
- 10. QList i shared_ptr
- 11. Apple i shared_ptr
- 12. Deklaracje przekazywania i shared_ptr
- 13. Czy jest zagwarantowane, że weak_ptr wygaśnie, gdy shared_ptr zostanie zresetowany na ten sam adres, który zawiera?
- 14. std :: unique_ptr vs std :: shared_ptr vs std :: weak_ptr vs std :: auto_ptr vs surowe wskaźniki
- 15. Wzorzec obserwatora za pomocą metody weak_ptr
- 16. Podnieś shared_ptr koszt dereferencji
- 17. std :: shared_ptr i initializer listy
- 18. shared_ptr i odwołań w C++
- 19. Missing Index Szczegóły SQL
- 20. std :: map z std :: weak_ptr key
- 21. Obliczenia zmiennoprzecinkowe IEEE-754, równość i zwężenie
- 22. Missing ostrzeżenie niewyczerpującym meczu
- 23. Missing CrudRepository # findOne method
- 24. Spring: Missing JPA Metamodel
- 25. C++ 0x std :: shared_ptr vs. boost :: shared_ptr
- 26. Równość dla typów anonimowych
- 27. Równość funkcji w Haskell
- 28. Równość w typach referencji
- 29. Równość/nierówność macierzy:
- 30. Jak poprawnie zastąpić równość?
Ale 'weak_ptr' nie ma metody" get ". –
Derp. Błędnie przeczytałem pytanie. –