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.

questionAnswers(6)

yourAnswerToTheQuestion