A volte ho bisogno delle istanze shared_ptr
che hanno un deleter no-op, perché un'API si aspetta un'istanza shared_ptr
che desidera archiviare per un tempo limitato, ma mi viene fornito un puntatore raw che non sono autorizzato a possedere per un tempo maggiore di per cosa sto correndo.È un aliasing vuoto shared_ptr una buona alternativa a un no-op che elimina shared_ptr?
Per questo caso, ho utilizzato un deleter no-op, come ad esempio [](const void *){}
, ma oggi ho scoperto che c'è un'altra alternativa a quella, usando (o abusando?) Il aliasing constructor di shared_ptr
:
void f(ExpectedClass *ec) {
std::shared_ptr<ExpectedClass> p(std::shared_ptr<void>(), ec);
assert(p.use_count() == 0 && p.get() != nullptr);
apiCall(p);
}
La mia domanda è, qual è il modo migliore per farlo e perché? Le aspettative di rendimento sono le stesse? Con un deleter no-op mi aspetto di pagare un costo per la memorizzazione del deleter e del conteggio dei riferimenti, che non sembra essere il caso quando si utilizza il costruttore aliasing con lo shared_ptr
vuoto.
Sì, c'è una nota che menziona questa stranezza in [util.smartptr.shared.const]/16. IMHO è il corollario del fatto che puoi avere un 'shared_ptr' non vuoto che memorizza null (' shared_ptr ((T *) nullptr) '). Potenzialmente un po 'confuso, ma valido. Un problema con questo uso è che le copie di 'p' non condividono la proprietà con esso, perché nessuno di loro possiede nulla. Ciò potrebbe essere importante per alcuni usi che prevedono il controllo degli oggetti che condividono la proprietà (tramite 'owner_less') ma probabilmente non è un problema per l'utilizzo che descrivi. –
@ JonathanWakely grazie per la nota. La nota prima di esso/15) mi confonde. Perché l'utente deve assicurarsi che 'p' rimanga valido finché il gruppo di proprietà di' r' non viene distrutto in 'shared_ptr <> (r, p)'? Pensavo che fosse il lavoro di 'shared_ptr'. Se lo metto via, il puntatore aliasing sarà sempre valido perché impedisce al gruppo di proprietà di 'r' di essere distrutto, in modo che l'utente possa" copiarlo e dimenticarlo "o mi manchi qualcosa? –
Ah capisco cosa significa. Nel caso in cui la durata di 'p' non sia legata alla durata di' r' (che è consentita), allora la durata di 'r' non implica la durata di' p' e quindi l'utente deve garantirlo. –