boost::shared_ptr
ha un costruttore di insolitoPer cosa è usato shared_ptr di boost (shared_ptr <Y> const & r, T * p)?
template<class Y> shared_ptr(shared_ptr<Y> const & r, T * p);
e io sono un po 'perplesso su ciò che questo sarebbe utile per. Fondamentalmente condivide la proprietà con r
, ma .get()
restituirà p
. nonr.get()
!
Ciò significa che si può fare qualcosa di simile:
int main() {
boost::shared_ptr<int> x(new int);
boost::shared_ptr<int> y(x, new int);
std::cout << x.get() << std::endl;
std::cout << y.get() << std::endl;
std::cout << x.use_count() << std::endl;
std::cout << y.use_count() << std::endl;
}
E otterrete questo:
0x8c66008
0x8c66030
2
2
Nota che i puntatori sono separati, ma entrambi affermano di avere un use_count
di 2 (dal momento che condividono la proprietà dello stesso oggetto).
Così, il int
di proprietà di x
esisterà finché x
oy
è intorno. E se capisco che i documenti sono corretti, il secondo int
non viene mai distrutto. Ho confermato questo con il seguente programma di test:
struct T {
T() { std::cout << "T()" << std::endl; }
~T() { std::cout << "~T()" << std::endl; }
};
int main() {
boost::shared_ptr<T> x(new T);
boost::shared_ptr<T> y(x, new T);
std::cout << x.get() << std::endl;
std::cout << y.get() << std::endl;
std::cout << x.use_count() << std::endl;
std::cout << y.use_count() << std::endl;
}
Questo uscite (come previsto):
T()
T()
0x96c2008
0x96c2030
2
2
~T()
Quindi ... qual è l'utilità di questa insolita costrutto che condivide la proprietà di un puntatore , ma funge da come un altro puntatore (che non possiede) quando viene utilizzato.
Buona domanda. +1 – GManNickG
TL; Versione DR: crea un puntatore a un sottooggetto di 'r'. –