Program Language/C & C++

[C++] 스마트 포인터

야곰야곰+책벌레 2021. 10. 25. 13:59
728x90
반응형

  스마트 포인터는 <memory>에 정의되어 있고, RAII 또는 리소스 획득 초기화 프로그래밍 관용구에 매우 중요하다. 스마터 포인터의 목표는 개체의 모든 자원 생성이 한 줄의 코드에서 만들어지고 준비되어 그 개체가 초기화되는 동시에 자원 수집이 발생하는 것을 확인하는 것이다.

  이전 포인터 선원과 비교하면 아래와 같다.

void UseRawPointer()
{
    Song* pSong = new Song(L"Nothing on You", L"Bruno Mars"); 
    // Use pSong
    delete pSong;   
}

void UseSmartPointer()
{
    unique_ptr<Song> song2(new Song(L"Nothing on You", L"Bruno Mars"));
    // Use song2
    // delete automatically
}

  위와 같이 스마트 포인터는 스택에 선언되고 힙 할당 개체를 가리키는 기존 방식의 포인터를 사용하여 초기화하는 스마트 보인다. 스마트 포인터가 초기화되면 기존 방식의 포인터를 소유한다. 스마트 포인터 소멸자에는 삭제할 호출이 포함되며, 스마트 포인터는 스택에 선언되기 때문에 스마트 포인터가 범위를 벗어나면 스택의 다른 위치에서 예외 throw 되더라도 해당 소멸자가 호출된다.

 

C++ 표준 라이브러리 스마트 포인터

  • unique_ptr : 기본 포인터로 한 명의 소유자만 허용한다. 새 소유자로 이동할 수 있지만 복사하거나 공유할 수 없다. 사용하지 않는 auto_ptr을 대체한다.
  • shared_ptr : 참조 횟수가 계산되는 스마트 포인터다. 원시 포인터 하나를 여러 소유자에게 할당하려고 할 경우 사용한다. 원시 포인터는 모든 shared_ptr 소유자가 범위를 벗어나거나 소유권을 포기할 때까지 삭제되지 않는다.
  • weak_ptr : shared_ptr과 함께 사용할 수 있는 특별한 경우의 스마트 포인터다. weak_ptr은 하나 이상의 shared_ptr 인스턴스가 소유하는 개체에 대한 액세스를 제공하지만, 참조 수 계산에 참가하지 않는다. 개체를 관찰하는 동시에 해당 개체를 활성 상태로 유지하지 않으려는 경우 사용한다.

예제 : unique_ptr로 캡슐화 하기

스마트 포인터는 메모리 및 성능 관점에서 최대한 효율적으로 사용할 수 있도록 설계되어 있다. 

class LargeObject
{
public:
    void DoSomething(){}
};

void ProcessLargeObject(const LargeObject& lo){}
void SmartPointerDemo()
{    
    // Create the object and pass it to a smart pointer
    std::unique_ptr<LargeObject> pLarge(new LargeObject());

    //Call a method on the object
    pLarge->DoSomething();

    // Pass a reference to a method.
    ProcessLargeObject(*pLarge);

} //pLarge is deleted automatically when function block goes out of scope.
  1. 스마트 포인터를 지역변수로 선언한다. 
  2. 형식 매개 변수에 캡슐화된 포인터가 가리키는 대상의 형식을 지정한다.
  3. 스마트 포인터 new 생성자의 개체에 원시 포인터를 전달한다.
  4. 오버 로드된 -> 및 * 연산자를 사용하여 개체에 액세스 한다.
  5. 스마트 포인터로 개체를 삭제할 수 있다.

 

 

스마트 포인터(최신 C++)

자세한 정보: 스마트 포인터(최신 C++)

docs.microsoft.com

 

728x90
반응형