Ecco una citazione dalla sezione di nota di implementazione di cppreference di std::shared_ptr
, che indica che ci sono due diversi puntatori (come mostrato in grassetto): quello che può essere restituito da get()
e quello che contiene i dati effettivi all'interno del blocco di controllo.Perché sono necessari due puntatori raw dell'oggetto gestito necessari nell'implementazione std :: shared_ptr?
In una tipica implementazione,
std::shared_ptr
vale soltanto due punti:
- il puntatore memorizzato (quello restituito dal
get()
)- un puntatore per controllare blocco
Il controllo il blocco è un oggetto assegnato dinamicamente che contiene:
- o un puntatore all'oggetto gestito o l'oggetto gestito stessa
- la delezione (tipo-cancellati)
- l'allocatore (tipo-cancellati)
- il numero di
shared_ptrs
che possiede l'oggetto gestito- il numero di
weak_ptrs
che si riferiscono all'oggetto gestitoil puntatore tenuto dal
shared_ptr
è direttamente restituito daget()
, mentre il puntatore o l'oggetto trattenuto dal blocco di controllo è quello che verrà eliminato quando il numero di proprietari condivisi raggiunge lo zero. Questi indicatori non sono necessariamente uguali.
La mia domanda è, perché sono necessari due puntatori diversi (i due in grassetto) necessari per l'oggetto gestito (oltre al puntatore del blocco di controllo)? Non è sufficiente quello restituito da get()
? E perché questi indicatori non sono necessariamente uguali?
IIUC implica che ci sono effettivamente, potenzialmente almeno, * tre * puntatori coinvolti: 1. Qualcosa restituito da get(); 2.Potenzialmente un puntatore * all'interno * del blocco di controllo verso l'oggetto che verrà eliminato alla fine; 3. Un puntatore al blocco di controllo. Due di questi sono detenuti dal ptr condiviso; il terzo risiede all'interno del blocco di controllo. –
Questa è una domanda diversa, come ho sottolineato nel mio precedente commento. Non riguarda il blocco di controllo rispetto all'oggetto, ma il fatto che ci sono * due * puntatori su "l'oggetto" che possono anche essere diversi (o non ci sarebbe bisogno di tenerne due). * Più * il ptr al blocco di controllo. (E la risposta ha a che fare con il costruttore aliasing shared_ptr.) –
Dalla mia comprensione, la risposta in http://stackoverflow.com/a/26351926 riguarda la differenza tra i due metodi di costruzione, ma non spiega ancora perché due possibili allocazioni diverse sono necessarie in primo luogo. – btshengsheng