boost::shared_ptr
tiene un constructor inusual¿Para qué se utiliza shared_ptr (shared_ptr <Y> const & r, T * p) de boost?
template<class Y> shared_ptr(shared_ptr<Y> const & r, T * p);
y estoy un poco perplejo en cuanto a lo que esto sería útil para. Básicamente comparte la propiedad con r
, pero .get()
devolverá p
. nor.get()
!
Esto significa que puede hacer algo como esto:
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;
}
Y obtendrá esto:
0x8c66008
0x8c66030
2
2
Tenga en cuenta que los punteros están separados, pero ambos dicen tener un use_count
de 2 (dado que comparten la propiedad del mismo objeto).
Por lo tanto, la propiedad de int
x
existirán siempre y cuando x
oy
es de alrededor. Y si entiendo los documentos correctos, el segundo int
nunca se destruye. He confirmado esto con el siguiente programa de prueba:
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;
}
Este salidas (como se esperaba):
T()
T()
0x96c2008
0x96c2030
2
2
~T()
Entonces ... ¿cuál es la utilidad de este constructo inusual que comparte la propiedad de un puntero , pero actúa como como otro puntero (que no posee) cuando se usa.
Buena pregunta. +1 – GManNickG
TL; Versión DR: crea un puntero a un subobjeto de 'r'. –