Language/C++

[C++] 스마트 포인터

0so0 2023. 9. 25. 19:00
728x90
반응형
SMALL

스마트 포인터에 대한 정리

SMALL
반응형

RAII(Resource acquisition is initialization) 패턴

객체가 쓰이는 Scope를 벗어나면 Resource를 해제해주는 기법
bool error() {
    return true;
}

void fnc() {
    int* c = new int[100];
    if (error()) return;
    delete[] c;
}

int main(void) {
    fnc();
    _CrtDumpMemoryLeaks();
    
    return 0;
}
Detected memory leaks! Dumping objects -> {156} normal block at 0x00C60C58, 400 bytes long. Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD Object dump complete.

위와 같이 예외(에러)가 발생할 경우 c가 소멸되지 않아 메모리 누수가 발생하기 때문에 이 문제를 해결하기 위해 RAII 패턴 도입
 
* _CrtDumpMemoryLeaks() 관련 내용은 아래 참고

스마트 포인터(Smart pointer)

메모리 누수(memory leak)로 부터 프로그램의 안정성을 보장하기 위해 C++에서 제공하는 기능

 

unique_ptr

하나의 스마트포인터만이 특정 객체를 소유할 수 있도록 객체에 소유권 개념을 도입한 포인터
소유권을 이전할 수 있지만 스마트포인터가 객체의 소유권을 가지고 있을 때에만 소멸자가 해당 객체를 삭제가능
int main(void) {

    int* temp = new int;
    *temp = 1;

    unique_ptr<int> u1(temp);
    cout << "u1 : " << *u1 << endl;
    unique_ptr<int> u2(new int(2));
    cout << "u2 : " << *u2 << endl;

    // u1의 소유권 이전
    unique_ptr<int> u3 = move(u1);
    cout << "u3 : " << *u3 << endl;
    
    // u1의 소유권이 이전되어 u1 복사시 compile error 발생
    unique_ptr<int> u4 = u1; 
}

std::make_unique

지정된 타입의 객체 생성, 생성된 객체를 가리키는 unique_ptr 반환
class test {
    int a, b;

public :
    test(int a, int b) : a(a), b(b){

    }
    int add() {
        return a + b;
    }
    ~test() {

    }
};

int main(void) {
    auto ptr = make_unique<test>(2, 3);
}

shared_ptr

하나의특정 객체를 참조하는 스마트 포인터가 몇개인지 확인하고, 참주 횟수가 0이 되면 메모리를 자동 해제(delete)하는 포인터
int main(void) {
    // shared_ptr<객체> s1(new 객체);
    shared_ptr<int> s1(new int(5));
    cout << "s1 : " << *s1 << endl;
    cout << "s1 use_count : " << s1.use_count() << endl;

    auto s2 = s1;
    cout << "s2 use_count : " << s2.use_count() << endl;

    s1.reset();
    cout << "s2 use_count : " << s2.use_count() << endl;
    s2.reset();

    return 0;
}

weak_ptr

shared_ptr에서 순환 참조가 일어나는 것을 제거하기 위해 사용하는 포인터
shared_ptr 인스턴스가 소유하는 객체에 대한 접근만 허용
728x90
반응형
LIST