상세 컨텐츠

본문 제목

C++ Smart Pointer에 대하여

C++/개념공부

by J2on 2024. 2. 7. 18:17

본문

 

C++의 큰 특징 중 하나

 

Pointer를 이용한 직접적인 메모리 관리가 가능하다.

 

하지만, 프로그래머가 직접 관리하다보니 메모리 누수가 발생할 수 있다. 

 

이를 위해 Smart Pointer를 사용한다. 

 

Smart Pointer는 일반 Pointer를 wrapping하는 형태로 구성된다. 

 

Smart Pointer의 종류

1. unique_ptr (Unique Pointer)

  • 어떠한 object가 오직 한 개의 참조만이 가능할 때, 새로운 참조가 생기면 기존 pointing을 끊어버리는 것.
#include <memory>
#include <iostream>

class MyClass {
public:
    MyClass() {
        std::cout << "MyClass 생성자 호출\\n";
    }

    ~MyClass() {
        std::cout << "MyClass 소멸자 호출\\n";
    }

    void doSomething() {
        std::cout << "뭔가를 수행 중...\\n";
    }
};

int main() {
    // std::unique_ptr을 사용하여 동적으로 할당된 객체를 관리
    std::unique_ptr<MyClass> uniquePtr = std::make_unique<MyClass>();

    // 객체에 접근
    uniquePtr->doSomething();

    // 메모리는 자동으로 관리되므로 따로 delete할 필요 없음

    return 0; // uniquePtr가 범위를 벗어나면 MyClass는 자동으로 삭제됨
}

 

 

2, shared_ptr (Shared Pointer)

  • object가 몇 개의 pointer에 의해 pointing 되고 있는지 알려준다.
  • 참조되는 (pointing)의 수가 0이 되면 해당 object를 지워버림
    #include <memory>
    #include <iostream>
    class MyClass {
    public:
        MyClass() {
            std::cout << "MyClass 생성자 호출\\n";
        }
    
        ~MyClass() {
            std::cout << "MyClass 소멸자 호출\\n";
        }
    
        void doSomething() {
            std::cout << "뭔가를 수행 중...\\n";
        }
    };
    
    int main() {
        // std::shared_ptr을 사용하여 여러 곳에서 동적으로 할당된 객체를 공유
        std::shared_ptr<MyClass> sharedPtr1 = std::make_shared<MyClass>();
        std::shared_ptr<MyClass> sharedPtr2 = sharedPtr1; // 참조 계수가 증가
    
        // 객체에 접근
        sharedPtr1->doSomething();
        sharedPtr2->doSomething();
    
        // 메모리는 참조 계수에 따라 자동으로 관리됨
    
        return 0; // sharedPtr1과 sharedPtr2가 범위를 벗어나면 MyClass는 자동으로 삭제됨
    }
    
    

 

3. weak_ptr (Weak Pointer)

  • shared pointer를 이용할 때 두 object가 서로를 참조하고 있으면, shared pointer에서는 영원히 지워지지 않음.
  • 이런 경우를 Cyclic reference라고 하고 이걸 방지하기 위해 대신 사용하는 것이 Weak Pointer.
  • 객체를 소유하지 않는 약한 참조이기 떄문에 객체에 안전하게 접근함

관련글 더보기

댓글 영역