A cosa serve il costruttore di aliasing di shared_ptr?

In questa pagina ( http://www.cplusplus.com/reference/memory/shared_ptr/ ), paragrafo 5, si dice:

Inoltre, gli oggetti shared_ptr possono condividere la proprietà su un puntatore mentre allo stesso tempo puntano a un altro object. Questa abilità è conosciuta come aliasing (vedi costruttori), ed è comunemente usata per puntare agli oggetti membri mentre si possiede l’object a cui appartengono. Per questo motivo, shared_ptr può riguardare due indicatori:

  • Un puntatore memorizzato, che è il puntatore a cui si dice che punta, e quello che dereferenzia con l’operatore *.

  • Un puntatore proprietario (eventualmente condiviso), che è il puntatore che il gruppo proprietario è responsabile dell’eliminazione ad un certo punto e per il quale conta come un uso.

Generalmente, il puntatore memorizzato e il puntatore di proprietà si riferiscono allo stesso object, ma gli oggetti alias shared_ptr (quelli creati con il costruttore alias e le loro copie) possono fare riferimento a oggetti diversi .

Poi ho letto questa pagina ( http://www.cplusplus.com/reference/memory/shared_ptr/shared_ptr/ ) sul costruttore di aliasing di shared_ptr. Ma continuo a pensare che questo comportamento “aliasing” sia fonte di confusione. Perché è qui? Cosa serve? In che situazione vorrei questa funzione?

Semplice esempio:

 struct Bar { // some data that we want to point to }; struct Foo { Bar bar; }; shared_ptr f = make_shared(some, args, here); shared_ptr 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); 

L’aliasing è per quando vogliamo davvero puntare a Bar , ma non vogliamo neanche che Foo venga eliminato da sotto di noi.


Come sottolinea Johannes nei commenti, c’è una caratteristica linguistica un po ‘equivalente:

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

Stiamo prendendo un riferimento a un membro di un temporaneo, ma il Foo temporaneo è ancora tenuto in vita fino a quando è specific_data . Come con l’esempio shared_ptr , quello che abbiamo è un Bar cui durata è legata a un Foo – a Foo cui non possiamo accedere.