domanda sull’assegnazione con boost :: shared_ptr (rispetto alla funzione reset ())

Scusa se questa risposta è esplicita da qualche parte, ma sono un po ‘confuso dalla documentazione di boost e dagli articoli che ho letto online.

Vedo che posso usare la funzione reset () per rilasciare la memoria all’interno di shared_ptr (assumendo che il conteggio dei riferimenti vada a zero), ad es.

shared_ptr x(new int(0)); x.reset(new int(1)); 

Questo, credo, porterebbe alla creazione di due oggetti interi, e alla fine di queste due righe il numero intero uguale a zero verrebbe cancellato dalla memoria.

Ma, cosa succede se utilizzo il seguente blocco di codice:

 shared_ptr x(new int(0)); x = shared_ptr(new int(1)); 

Ovviamente, ora * x == 1 è vero, ma l’object intero originale (uguale a zero) sarà cancellato dalla memoria o ho perso quella memoria?

Mi sembra che questo sarebbe un problema dell’operatore di assegnazione che diminuisce il conteggio dei riferimenti di shared_ptr, ma uno sguardo al codice sorgente non sembra cancellare la domanda per me. Spero che qualcuno più esperto o esperto possa aiutarmi. Grazie in anticipo.

La documentazione è abbastanza chiara:

shared_ptr & operator=(shared_ptr const & r); // never throws

Effetti: Equivalente a shared_ptr(r).swap(*this) .

Quindi scambia solo la proprietà con l’object temporaneo che crei. Il temporaneo quindi scade, diminuendo il conteggio dei riferimenti. (E deallocare se zero).


Lo scopo di questi contenitori è di non perdere memoria. Quindi no, non devi preoccuparti di perdere le cose a meno che tu non stia cercando di rovinare tutto di proposito. (In altre parole, probabilmente non hai bisogno di dubitare che Boost sappia cosa stanno facendo).

Non hai perso la memoria. La memoria per il primo object int sarà cancellata.