unique_ptr이란?

C++ 표준 라이브러리 <memory> 헤더에 정의된 스마트 포인터로, 동적 메모리를 안전하고 효율적으로 관리하는데 사용

unique_ptr은 소유권이 하남나 존재하는 스마트 포인터로, 복사할 수 없지만, 소유권을 이동할 수 있다.

 

주요 특징

1. 단일 소유권

  • unique_ptr은 한 번에 하나의 포인터만 메모리 리소스를 소유할 수 있다.
  • 복사 생성자와 복사 대입 연산자가 삭제 되어 있어 복사가 불가능하다.
  • 소유권을 이동하려면 std::move를 사용하면 된다.

2. 자동 해제

  • unique_ptr이 범위를 벗어나면 소유하고 있는 메모리를 자동으로 해제한다.(delete 호출)

3. 가벼움

  • unique_ptr은 추가적인 참조 카운터를 사용하지 않으므로 shared_ptr보다 가볍다.
#include <iostream>
#include <memory>

using namespace std;

class MyClass
{
public:
	MyClass()
    {
    	cout << "MyClass 생성" << endl;
    }
    ~MyClass()
    {
    	cout << "MyClass 소멸" << endl;
    }
    void display()
    {
    	cout << "Hello, unique_ptr" << endl;
    }
};
int main()
{
	unique_ptr<MyClass> myPtr = make_unique<MyClass>(); // unique_ptr 생성
    
    myPtr->display(); // 멤버 함수 호출
    
    return 0; // unique_ptr은 자동으로 소멸자를 호출하여 메모리를 해제
}

 

소유권 이동

 

unique_ptr은 복사가 불가능하지만, std::move를 사용해 소유권을 이동할 수 있다.

unique_ptr<MyClass> ptr1 = make_unique<MyClass>();
unique_ptr<MyClass> ptr2 = std::move(ptr1);

if(!ptr1)
{
	cout << "ptr1은 이제 비어있음" << endl;
}

 

해제

 

소유하고 있는 객체를 명시적으로 해제하려면 reset을 사용한다.

ptr.reset();

 

shared_ptr이란?

 

C++ 표준 라이브러리 <memory> 헤더에 정의된 스마트 포인터 중 하나로, 참조 카운팅(reference counting)을 통해 동적 메모리의 공유 소유권을 관리한다.

 

주요 특징

 

1. 공유 소유권

  • shared_ptr을 여러 객체가 동시에 소율할 수 있다.
  • 소유권을 공유하는 모든 shared_ptr이 삭제될 때 리소스가 해제된다.

2. 참조 카운터

  • shared_ptr은 내부적으로 참조 카운터를 유지한다.
  • 새로운 shared_ptr이 소멸하거나 reset 되면 참조 카운터가 감소한다.
  • 참조 카운터가 0이 되면 리소스를 해제한다.

3. 자동 메모리 관리

  • shared_ptr은 동적 메모리를 안전하게 관리하며, 사용자가 수동으로 delete를 호출할 필요가 없다.

 

#include <iostream>
#include <memory>

using namespace std;

int main()
{
	shared_ptr<int> ptr1 = make_shared<int>(10); // 정수 10을 관리하는 shared_ptr 생성
    cout << "값 : " << *ptr1 << endl;
   
   return 0;
}

 

use_count()

현재 리소스를 공유하고 있는 shared_ptr의 개수를 반환한다.

cout << ptr.use_count() << endl;
#include <iostream>
#include <memory>

using namespace std;

class MyClass
{
public:
	MyClass(){
    	cout << "MyClass 생성" << endl;
    }
    ~MyClass(){
    	cout << "MyClass 소멸" << endl;
    }
};

int main(){
	shared_ptr<MyClass> ptr1 = make_shared<MyClass>(); // 객체 생성
    shared_ptr<MyClass> ptr2 = ptr1; // 소유권 공유
    
    cout << "참조 카운트 : " << ptr1.use_count() << endl; // 참조 카운트 출력 2
    
    ptr1.reset(); // ptr1 소유권 해제
    cout << "참조 카운트: " << ptr2.use_count() << endl; // 남은 참조 카운트 출력 1
    
    return 0;

+ Recent posts