2014-11-24 12 views
26

Na tej stronie (http://www.cplusplus.com/reference/memory/shared_ptr/), pkt 5, mówi:Do czego służy aliasing konstruktora shared_ptr?

Dodatkowo shared_ptr obiekty mogą udostępniać własność nad wskaźnikiem, gdy w tym samym czasie, wskazując na inny obiekt. Ta umiejętność jest znana jako aliasing (patrz konstruktory) i jest powszechnie używana do wskazywania obiektów członkowskich podczas posiadania obiektu, do którego należą. Z tego powodu, o shared_ptr może odnosić się do dwóch wskaźników:

  • A zapisany wskaźnik, który wskaźnik jest powiedziane, aby wskazać, a ten to dereferences z operatorem *.

  • Własny wskaźnik (prawdopodobnie udostępniony), który jest wskaźnikiem, który grupa własności jest odpowiedzialna za usuwanie w pewnym momencie i dla którego liczy się jako użycie.

ogół przechowywane wskaźnik i posiadanych wskaźnik odnosi się do tego samego obiektu ale alias shared_ptr obiektów (te skonstruowane z konstruktora ps i ich kopii) może odnosić się do różnych obiektów.

Następnie czytam tę stronę (http://www.cplusplus.com/reference/memory/shared_ptr/shared_ptr/) o konstruktorze aliasingu shared_ptr. Ale nadal uważam, że to zachowanie "aliasingowe" jest mylące. Dlaczego jest tutaj? Po co to jest? W jakiej sytuacji chciałbym tę funkcję?

+8

Z własnego cytatu: "[aliasing] jest zwykle używany do wskazywania obiektów członkowskich, podczas gdy posiadają obiekt, do którego należą." – hvd

+0

powinieneś już znać aliasing, ponieważ zarówno C jak i C++ pozwala domyślnie na aliasowanie, nawet bez uwzględnienia 'shared_ptr', w którym używasz już języka, który domyślnie umożliwia aliasing. – user2485710

+0

@hvd yes. Zauważyłem to później, gdy opublikowałem to pytanie. Ale nadal nie jest wystarczająco precyzyjny. – lqr

Odpowiedz

30

Prosty przykład:

struct Bar { 
    // some data that we want to point to 
}; 

struct Foo { 
    Bar bar; 
}; 

shared_ptr<Foo> f = make_shared<Foo>(some, args, here); 
shared_ptr<Bar> specific_data(f, &f->bar); 

// ref count of the object pointed to by f is 2 
f.reset(); 

// the Foo still exists (ref cnt == 1) 
// so our Bar pointer is still valid, and we can use it for stuff 
some_func_that_takes_bar(specific_data); 

Aliasing jest, gdy naprawdę chcemy wskazać Bar, ale my też nie chcemy Foo aby usunięte spod nas.


Jak Johannes zwraca uwagę w komentarzach, jest nieco równoważne funkcja język:

const Bar& specific_data = Foo(...).bar; 

Zabieramy odniesienie do członka tymczasowy, ale tymczasowy Foo jest nadal utrzymywana żyje tak długo, jak długo jest specific_data. Podobnie jak w przypadku przykładu shared_ptr, mamy do czynienia z Bar, którego żywotność jest powiązana z Foo - a Foo, do której nie mamy dostępu.

+0

'ale my również nie chcemy, aby Foo zostało usunięte spod nas \ 'to jest praca dla twojego' shared_ptr', nic naprawdę blisko tego, do czego służy aliasing. – user2485710

+1

@ user2485710 Myślę, że nie rozumiesz pytania? Utworzony przeze mnie "shared_ptr " w rzeczywistości współdzieli własność z 'shared_ptr '. W tym wszystkim jest tylko jeden ukryty obiekt, ale konstruktor aliasingu pozwala nam zamiast tego użyć 'shared_ptr' wskazującego członka. – Barry

+0

Masz na myśli na wypadek, gdybyś chciał zresetować 'f', ale nie chcesz, aby obiekt wskazany przez' f' został zniszczony, ponieważ będziesz potrzebował jego obiektu członkowskiego? O. Wielkie dzięki.Rozumiem. q ^.^p – lqr