다음을 통해 공유


방법: 만들기 및 unique_ptr 인스턴스를 사용 합니다.

A unique_ptr 해당 포인터를 공유 하지 않습니다.다른 컴퓨터로 복사할 수 없습니다 unique_ptr, (이 수정할 수 있는 rvalue 아니라면) 값으로 함수에 전달, 또는 복사본 수 있도록 필요한 모든 STL (표준 템플릿 라이브러리) 알고리즘을 사용 합니다.A unique_ptr 만 이동할 수 있습니다.이 메모리 리소스의 소유권을 새 전송 되는 것을 의미 unique_ptr 및 원래 unique_ptr 더 이상 소유 하 고 없습니다.프로그램 논리를 여러 소유권 복잡해 때문에 하나 소유자를 개체를 제한 하는 것이 좋습니다.따라서 사용 하는 일반 C++ 개체에 대해 스마트 포인터를 해야 하는 경우 unique_ptr.

다음 다이어그램의 소유권 전송이 두 설명 unique_ptr 인스턴스.

unique_ptr의 소유권 이동 중

unique_ptr에 정의 되어 있는 <memory> 에서 STL 헤더.정확 하 게 것에 대 한 원시 포인터로 효율적 이며 STL 컨테이너에 사용할 수 있습니다.추가 unique_ptr 인스턴스 STL 컨테이너에 효율적입니다 때문에 이동의 생성자는 unique_ptr 복사 작업이 필요 하지 않습니다.

예제

다음 예제에서는 만드는 방법을 보여 줍니다. unique_ptr 인스턴스 및 해당 함수 간에 전달 됩니다.

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

이 기본적인 특징을 보여 주는 이러한 예제 unique_ptr: 이동 수 있지만 복사 되지 않습니다. 이때 전송 새 소유권 이동" unique_ptr 이전에 다시 설정 하 고 unique_ptr.

다음 예제에서는 만드는 방법을 보여 줍니다. unique_ptr 인스턴스 및 벡터를 사용 합니다.

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

에 for_each 루프, 알은 unique_ptr 람다 식에 대 한 참조로 전달 됩니다.여기 값별로 전달 하려고 하면 컴파일러 오류가 throw 됩니다는 unique_ptr 는 복사 생성자를 사용할 수 있습니다.

초기화 하는 방법을 다음 예제는 unique_ptr 클래스 멤버입니다.


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

참고 항목

개념

스마트 포인터 (현대 C++)