I naprawdę nie jak jeden z poprzednich odpowiedzi tak:
Nie, nie wiem od implementacji, ale myślę, że to możliwe. Standardowa implementacja shared_ptr zawiera dwie liczniki referencji, jedną dla "silnego" i jedną dla "słabych" referencji, a także wskaźnik do referencji. W implementacji intrusive_ptr silna liczba musi być częścią obiektu, ale słabe nie może być. Wygląda na to, że możesz stworzyć "słabe" intrusive_ptr.
Definiowanie słaby wskaźnik pomocnika:
template<class X>
class intrusive_ptr_weak_helper {
long weak_ref_count;
X *target_instance;
};
następnie nagrać że do obiektu obok liczby odniesienia:
struct X {
...
intrusive_ptr_weak_helper *ref_weak_helper;
...
long ref_count;
...
};
przy konstruowaniu X:
ref_count = 0;
ref_weak_helper = NULL;
W "mocny" wskaźnik, intrusive_strong_ptr, jest identyczny z intrusive_ptr, dopóki nie nastąpi usunięcie. Gdy silny Ilość ref wychodzi na zero (zanim nastąpi skreślenie):
if (ref_weak_helper != NULL) {
if (ref_weak_helper->weak_ref_count == 0)
delete ref_weak_helper;
else
ref_weak_helper->target_instance = NULL;
}
W „słaby” wersja, intrusive_weak_ptr, zapisuje wskaźnik do słabego pomocnika, manipulując tego licznika odwołań, a dostęp do obiektu docelowego poprzez target_instance wskaźnik. Gdy weak_ref_count zmniejsza się do zera, status parametru target_instance określa, czy helper został usunięty, czy nie.
Brakuje wielu szczegółów (na przykład dotyczy współbieżności), ale jest to mieszanie shared_ptr i intrusive_ptr. Utrzymuje podstawowe zalety intrusive_ptr (optymalizacja pamięci podręcznej, ponowne użycie intruzyjnego (silnego) licznika referencji, silne i słabe wskaźniki stand-in są wielkościami wskaźnika), przy jednoczesnym dodaniu dodatkowej pracy głównie w słabej ścieżce referencyjnej.
Mój pomysł polega na osadzeniu współdzielonego obiektu używanego przez współdzielony ptr i słaby ptr wewnątrz obiektu hosta i intrusive_weak_ptr (jeśli istniał) użyłby go w taki sam sposób, jak robi to weak_ptr. Nadal potrzebuję funkcji usuwania obiektu, gdy nie ma już żadnych odniesień. Ponadto muszę wziąć słabe referencje. – Rich
Myślę, że nie zrozumiałeś mojego punktu widzenia: dokładnie to proponuję. Obiekt "Counted" jest "inwazyjnie" zliczany, właśnie zmieniłem licznik ze zwykłej liczby całkowitej na wskaźnik na liczbę całkowitą. Jeśli chodzi o twoją 'intrusive_weak_ptr', to właśnie nazwałem' WeakHandle'. –
Ah Myślę, że jestem z tobą. Więc użyłbym inwazyjnego wskaźnika jako normalnego, jednak gdy wywoływana jest metoda intrusive_ptr_add_ref, odwołuję się do int ze współużytkowanego wskaźnika jako liczby. Kiedy trafi zero, obiekt zostaje zwolniony, jednak wszelkie słabe referencje utrzymują wskaźnik na int. Czy to jest poprawne? – Rich