Do czego służy shared_ptr boost (shared_ptr <Y> const & r, T * p)?
boost::shared_ptr
ma niezwykłego konstruktora
template<class Y> shared_ptr(shared_ptr<Y> const & r, T * p);
i jestem trochę zdziwiony, co byłoby przydatne. Zasadniczo dzieli on własność zr
, ale.get()
wrócip
. nie r.get()
!
Oznacza to, że możesz zrobić coś takiego:
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;
}
I dostaniesz to:
0x8c66008
0x8c66030
2
2
Zauważ, że wskaźniki są oddzielne, ale obie twierdzą, że mająuse_count
2 (ponieważ dzielą własność tego samego obiektu).
Tak więcint
posiadany przezx
będzie istnieć tak długox
lub y
wynosi około. A jeśli rozumiem, że dokumenty są poprawne, drugiint
nigdy się nie zniszczy. Potwierdziłem to za pomocą następującego programu testowego:
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;
}
To wyjście (zgodnie z oczekiwaniami):
T()
T()
0x96c2008
0x96c2030
2
2
~T()
Więc ... jaka jest użyteczność tej niezwykłej konstrukcji, która dzieli własność jednego wskaźnika, aledzieje jak inny wskaźnik (którego nie posiada), gdy jest używany.