Grazie a std::make_shared
, mi chiedo se il costruttore per std::shared_ptr
, che accetta un puntatore raw, abbia alcun valore tranne quando si interfaccia con il codice legacy/library, ad es. quando si memorizza l'output di una fabbrica.Quando vorrei creare un puntatore condiviso da un puntatore raw
- Esistono altri casi d'uso legittimi?
- È un consiglio ragionevole evitare questo costruttore?
- Anche per quanto riguarda l'estensione del controllo dei codici per questo posto che avvisa il programmatore ogni volta che viene utilizzato?
- Le stesse linee guida (qualunque esse siano) si applicano a
shared_ptr<T>::reset(T*)
?
Per quanto riguarda i controlli di codice: So che l'interfacciamento con il codice legacy/biblioteca è abbastanza comune, codice controlla in modo automatizzato potrebbe essere problematico, ma nella maggior parte dei casi che ho incontrato finora, preferisco utilizzare un unique_ptr
comunque e inoltre non sto parlando di un avviso del compilatore che viene visualizzato su -Wall
, ma piuttosto su una regola per l'analisi del codice statico durante la revisione del codice.
La mia motivazione:
E 'relativamente facile dire "Non usare std::shared_ptr<T>(new T(...))
, preferisco sempre std::make_shared<T>(...)
" (che credo sia corretto consigliare?). Ma mi chiedo se non sia un odore di design in generale, se si deve creare un shared_ptr
da un puntatore raw, anche - o soprattutto - se l'oggetto non è stato appena creato tramite new
, perché l'oggetto avrebbe dovuto essere creato in primo luogo come oggetto "condiviso" o "unico".
Cosa succede se si desidera una classe shared-pointer-to-base e si desidera inizializzarla con una classe raw-pointer-to-derived? –
@ TheParamagneticCroissant: ciò può essere ottenuto con 'make_shared', no? – MikeMB
Non credo che usare ciecamente "make_shared" sia un consiglio corretto. Tenere presente che con rendere condiviso la memoria allocata viene rilasciata quando entrambi i contatori * e * deboli condivisi raggiungono lo zero. Questo è il prezzo dell'utilizzo di una singola allocazione per l'oggetto e il blocco di controllo. – sbabbi