[C++] Eliminazione esplicita di shared_ptr



Answers

[Modifica: puoi delete un shared_ptr se e solo se è stato creato con un new , uguale a qualsiasi altro tipo. Non riesco a pensare perché crei un shared_ptr con un new , ma non c'è niente che ti fermi.]

Bene, potresti scrivere delete ptr.get(); .

Ciò porta quasi inevitabilmente a un comportamento indefinito quando gli altri proprietari condivisi usano il loro shared_ptr per accedere all'oggetto cancellato, oppure l'ultimo shared_ptr all'oggetto viene distrutto e l'oggetto viene nuovamente cancellato.

Quindi no, non dovresti.

Lo scopo di shared_ptr è di gestire un oggetto che nessuna "persona" ha il diritto o la responsabilità di eliminare, perché potrebbero shared_ptr altri che condividono la proprietà. Quindi non dovresti neanche volerlo.

Question

Semplice domanda qui: sei autorizzato a eliminare esplicitamente un boost::shared_ptr tu stesso? Dovresti mai?

Chiarire, non intendo cancellare il puntatore tenuto da shared_ptr . Intendevo l'effettiva shared_ptr stessa. So che molte persone suggeriscono di non farlo, quindi mi stavo chiedendo se è giusto farlo esplicitamente.




Se vuoi simulare il decremento del conteggio, puoi farlo manualmente sullo heap in questo modo:

int main(void) {
    std::shared_ptr<std::string>* sp = new std::shared_ptr<std::string>(std::make_shared<std::string>(std::string("test")));
    std::shared_ptr<std::string>* sp2 = new std::shared_ptr<std::string>(*sp);
    delete sp;

    std::cout << *(*sp2) << std::endl;    // test
    return 0;
}

Oppure sullo stack usando std::shared_ptr::reset() modo:

int main(void) {
    std::shared_ptr<std::string> p = std::make_shared<std::string>(std::string("test"));
    std::shared_ptr<std::string> p2 = p;
    p.reset();

    std::cout << *p2 << std::endl;    // test
    return 0;
} 

Ma non è così utile.




Links