2012-06-10 13 views
10

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

+3

Ale 'weak_ptr' nie ma metody" get ". –

+0

Derp. Błędnie przeczytałem pytanie. –

Odpowiedz

15

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.

+0

Wywołanie 'blokady' dla większej części kodu naprawdę ma więcej sensu. Dobra decyzja dotycząca projektu. – abergmeier

4

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.

+2

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. –

+0

@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 ... –

+1

Nie, uzyskanie wskaźnika jest bezpieczne, o ile jest to zrobione * wewnętrznie *. –

Powiązane problemy