2011-01-21 22 views
5

Dla boost::weak_ptr zdefiniowano , dzięki czemu można go używać w pojemnikach asocjacyjnych.kolejność sortowania boost :: weak_ptr after expiring?

Moje pytanie brzmi: Czy porządek sortowania kilku obiektów weak_ptr jest stabilny, nawet jeśli niektóre z nich zmieniają się na zerowy poziom zerowy? Czy to nie jest bałagan z pojemnikami takimi jak std::set?

Przykład:

using namespace boost; 
shared_ptr<A> sptrA1(new A); 
weak_ptr<A> wptrA1 = sptrA1; 
weak_ptr<A> wptrA2; 

{ // begin Scope 1 
    shared_ptr<A> sptrA2(new A); 
    wptrA2 = sptrA2; 
    assert(wptrA1 < wptrA2); // assert #1 
} 
assert(wptrA1 < wptrA2); // assert #2 
  • będzie dochodzić nr 2 zawsze prawdziwe jeśli assert # 1 jest prawdziwe?
  • Czy wptrA2 jest w tym samym stanie przed i po Zakresie 1?

Odpowiedz

5

W aktualnej implementacji boost::weak_ptr, operator< porównuje wskaźnik z wewnętrzną strukturą śledzenia liczby referencyjnej. Ta struktura nie jest zwalniana, dopóki wszystkie silne odwołania i słabe nie zostaną usunięte, więc można bezpiecznie używać operator<, nawet jeśli wskazane dane użytkownika zostały zwolnione z powodu braku silnych odniesień.

+0

Interesujące. Byłem zdezorientowany przez dokumentację use_count w http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/weak_ptr.htm. Podaje "Zwraca: 0, jeśli * to jest puste", jednak zgodnie z twoją odpowiedzą, zwrot (* to jest puste, jeśli zwraca 0) nie jest prawdziwy, prawda? (Jeśli puste jest zdefiniowane jako stan uzyskany z domyślnego konstruowania pliku weak_ptr.) –

+0

Nie sformułowałem żadnych stwierdzeń o tym, co tutaj robi 'use_count'. Oznacza to, że wewnętrzna struktura zliczająca odniesienia utrzymuje dwa zliczenia - jeden dla silnych referencji (gdy osiąga zero, wskazany obiekt jest niszczony) i taki, który zawiera zarówno silne, jak i słabe odniesienie (gdy osiąga zero, struktura zliczająca odniesienia jest niszczona). Funkcja 'use_count' może wyglądać tylko na silnego licznika, ale ja nie badałem w ogóle, więc sprawdź sam. :) – bdonlan

2

Przeczytaj informacje o porównaniu weak_ptr here.

+0

Interesująca lektura. Nie dość trywialny problem. –

1

Użyj std :: owner_less. Porównuje to wskaźnik liczby użycia, a nie sam wskaźnik. Na przykład:

typedef std::weak_ptr<int> IntWPtr; 
std::set<IntWPtr, std::owner_less<IntWPtr> > m_set; 
+0

interesujące, jednak jest to funkcja C++ 11, której nie mogę teraz użyć. –

Powiązane problemy