shared_ptr pointer create c++ c++11

c++ - pointer - ¿Para qué es el constructor de alias de shared_ptr?



shared_ptr reference (1)

Ejemplo simple:

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);

El alias es para cuando realmente queremos apuntar a Bar , pero tampoco queremos que el Foo se elimine de debajo de nosotros.

Como señala Johannes en los comentarios, hay una característica del lenguaje algo equivalente:

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

Estamos tomando una referencia a un miembro de un temporal, pero el Foo temporal aún se mantiene con vida mientras diga specific_data . Al igual que con el ejemplo de shared_ptr , lo que tenemos es un Bar cuya vida está ligada a un Foo , un Foo que no podemos acceder.

En esta página ( http://www.cplusplus.com/reference/memory/shared_ptr/ ), párrafo 5, dice:

Además, los objetos shared_ptr pueden compartir la propiedad sobre un puntero mientras que al mismo tiempo apuntan a otro objeto. Esta capacidad se conoce como aliasing (ver constructores), y se usa comúnmente para apuntar a los objetos miembros mientras son dueños del objeto al que pertenecen. Debido a esto, un shared_ptr puede estar relacionado con dos punteros:

  • Un puntero almacenado, que es el puntero al que apunta, y el que desreferencia con el operador *.

  • Un puntero de propiedad (posiblemente compartido), que es el puntero que el grupo de propiedad se encarga de eliminar en algún momento, y para el cual cuenta como un uso.

En general, el puntero almacenado y el puntero propio se refieren al mismo objeto, pero los objetos alias shared_ptr (los construidos con el constructor de alias y sus copias) pueden referirse a diferentes objetos .

Luego leo esta página ( http://www.cplusplus.com/reference/memory/shared_ptr/shared_ptr/ ) sobre el constructor de aliasing de shared_ptr. Pero todavía creo que este comportamiento de "aliasing" es confuso. ¿Por qué está aquí? ¿Para qué sirve? ¿En qué situación me gustaría esta característica?