non mi piace nessuna delle risposte precedenti così:
No, non so di un'implementazione, ma penso che sia possibile. L'implementazione standard di shared_ptr contiene due riferimenti di riferimento, uno per il "forte" e uno per i riferimenti "deboli" e un puntatore al referente. In un'implementazione intrusive_ptr il conteggio forte deve essere parte dell'oggetto, ma il debole non può essere. Quindi, sembra che potresti creare un intrusive_ptr "debole".
Definire un debole puntatore helper:
template<class X>
class intrusive_ptr_weak_helper {
long weak_ref_count;
X *target_instance;
};
quindi registrare che nell'oggetto accanto al conteggio di riferimento:
struct X {
...
intrusive_ptr_weak_helper *ref_weak_helper;
...
long ref_count;
...
};
Quando si costruisce X:
ref_count = 0;
ref_weak_helper = NULL;
Il "forte" pointer, intrusive_strong_ptr, è identico a intrusive_ptr, fino a quando non si verifica la cancellazione. Quando il forte conteggio ref va a zero (prima che si verifichi l'eliminazione):
if (ref_weak_helper != NULL) {
if (ref_weak_helper->weak_ref_count == 0)
delete ref_weak_helper;
else
ref_weak_helper->target_instance = NULL;
}
Il "debole" versione, intrusive_weak_ptr, registra il puntatore al aiutante deboli, la manipolazione che contano di riferimento, e l'accesso l'oggetto di destinazione tramite il target_instance puntatore. Quando weak_ref_count decrementa a zero lo stato di target_instance determina se l'helper viene eliminato o meno.
Mancano molti dettagli (ad esempio, problemi di concorrenza) ma si tratta di un mix di shared_ptr e intrusive_ptr. Mantiene i vantaggi di base dell'intrusive_ptr (ottimizzazione della cache, riutilizzo del conteggio degli invii di terze parti (forte), puntatori dei puntatori forti e deboli sono di dimensioni puntatore) mentre aggiungono lavoro extra principalmente nel percorso di riferimento debole.
La mia idea è di incorporare l'oggetto condiviso utilizzato da ptr condiviso e ptr debole all'interno dell'oggetto host e intrusive_weak_ptr (se esistesse) lo userebbe nello stesso modo di weak_ptr. Ho ancora bisogno della funzionalità di cancellare l'oggetto quando non ci sono più riferimenti. Inoltre ho bisogno di prendere riferimenti deboli. – Rich
Penso che tu non abbia capito il mio punto: questo è esattamente ciò che propongo. L'oggetto 'Contato' è contato" intrusivamente ", ho appena cambiato il contatore da un intero semplice a un puntatore a un numero intero. Per quanto riguarda il tuo 'intrusive_weak_ptr' è proprio quello che ho chiamato' WeakHandle'. –
Ah penso di essere con te. Quindi userei un puntatore intrusivo come al solito, tuttavia quando viene invocato intrusive_ptr_add_ref, faccio riferimento a int dal puntatore condiviso come mio conteggio. Quando questo raggiunge zero, l'oggetto viene liberato, tuttavia qualsiasi riferimento debole mantiene un puntatore all'int. È corretto? – Rich