Compartir a través de


Cómo: Cree y use las instancias unique_ptr

A unique_ptr no comparte su puntero.No se puede copiar a otro unique_ptr, pasa por valor a una función (a menos que sea un valor de r modificable), o utilizar en cualquier algoritmo de biblioteca de plantillas estándar (STL) que requiera copias que se va a realizarse.A unique_ptr sólo se pueden mover.Esto significa que la propiedad de los recursos de memoria se transfiere a una nueva unique_ptr y el original unique_ptr ya no lo posee.Se recomienda restringir un objeto a un propietario, ya que varias propiedad agrega complejidad a la lógica del programa.Por lo tanto, cuando necesite un puntero inteligente para un objeto de C++ sin formato, utilice unique_ptr.

El siguiente diagrama ilustra la transferencia de propiedad entre dos unique_ptr las instancias.

Mover la propiedad de unique_ptr

unique_ptrse define en el <memory> encabezado en la STL.Es exactamente es eficaz como un puntero sin formato y se pueden utilizar en contenedores STL.La adición de unique_ptr las instancias a contenedores STL es eficiente porque el constructor de movimiento de la unique_ptr elimina la necesidad de una operación de copia.

Ejemplo

En el ejemplo siguiente se muestra cómo crear unique_ptr las instancias y pasar entre las funciones.

unique_ptr<Song> SongFactory(std::wstring artist, std::wstring title)
{
    // Implicit move operation into the variable that stores the result.
    return unique_ptr<Song>(new Song(artist, title));
}

void MakeSongs()
{
    // Create a new unique_ptr with a new object.
    unique_ptr<Song> pSong = unique_ptr<Song>(new Song(L"Mr. Children", L"Namonaki Uta"));

    // Use the unique_ptr
    vector<wstring> titles;
    titles.push_back(pSong->title);

    // Move raw pointer from one unique_ptr to another.
    unique_ptr<Song> pSong2 = std::move(pSong);

    // Obtain unique_ptr from function that returns rvalue reference.
    auto pSong3 = SongFactory(L"Michael Jackson", L"Beat It");
}

Estos ejemplos demuestran esta característica básica de unique_ptr: se puede mover, pero no copia. "Mover"transfiere la propiedad a una nueva unique_ptr y restablece la antigua unique_ptr.

En el ejemplo siguiente se muestra cómo crear unique_ptr las instancias y utilice en un vector.

void SongVector()
{
    vector<unique_ptr<Song>> v;

    // Create a few new unique_ptr<Song> instances
    // and add them to vector using implicit move semantics.
    v.push_back(unique_ptr<Song>(new Song(L"B'z", L"Juice")));
    v.push_back(unique_ptr<Song>(new Song(L"Namie Amuro", L"Funky Town")));
    v.push_back(unique_ptr<Song>(new Song(L"Kome Kome Club", L"Kimi ga Iru Dake de")));
    v.push_back(unique_ptr<Song>(new Song(L"Ayumi Hamasaki", L"Poker Face")));

    // Pass by reference to lambda body. 
    for_each(v.begin(), v.end(), [] (const unique_ptr<Song>& p)
    {
        wcout << L"Artist: " << p->artist << L"Title: " << p->title << endl; 
    });        
}

En el for_each de bucle, observe que la unique_ptr se pasa por referencia en la expresión lambda.Si se intenta pasar por valor aquí, el compilador generará un error debido a que la unique_ptr está deshabilitado el constructor de copias.

En el ejemplo siguiente se muestra cómo inicializar un unique_ptr es un miembro de clase.


class MyClass
{
private:
    // MyClass owns the unique_ptr.
    unique_ptr<ClassFactory> factory;
public:

    // Initialize by invoking the unique_ptr move constructor.
    MyClass() : factory ( unique_ptr<ClassFactory>(new ClassFactory()))
    {              

    }

    void MakeClass()
    {
        factory->DoSomething();
    }
};

Vea también

Conceptos

Punteros inteligentes (C++ moderno)