boost::shared_ptr
a un constructeur inhabituelA quoi sert shared_ptr de boost (shared_ptr <Y> const & r, T * p)?
template<class Y> shared_ptr(shared_ptr<Y> const & r, T * p);
et je suis un peu perplexe quant à ce que cela serait utile. Fondamentalement, il partage la propriété avec r
, mais .get()
renverra p
. pasr.get()
!
Cela signifie que vous pouvez faire quelque chose comme ceci:
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;
}
Et vous obtiendrez ceci:
0x8c66008
0x8c66030
2
2
Notez que les pointeurs sont séparés, mais ils ont tous deux prétendent avoir un use_count
de 2 (puisqu'ils partagent la propriété du même objet).
Ainsi, la int
appartenant à x
existera aussi longtemps que x
ouy
est autour. Et si je comprends bien les docs, le second int
ne sera jamais détruit. J'ai confirmé cela avec le programme de test suivant:
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;
}
Cette sortie (comme prévu):
T()
T()
0x96c2008
0x96c2030
2
2
~T()
Alors ... quelle est l'utilité de cette construction inhabituelle qui partage la propriété d'un pointeur , mais agit comme comme un autre pointeur (qu'il ne possède pas) lorsqu'il est utilisé.
Bonne question. +1 – GManNickG
TL; DR version: Crée un pointeur sur un sous-objet de 'r'. –