Home 스마트 포인터/메모리 풀 (Smart Pointer/Memory Pool)
Post
Cancel

스마트 포인터/메모리 풀 (Smart Pointer/Memory Pool)

[C++] 스마트포인터 (Smart Pointer)

c++ 에서 new 키워드를 통해 동적 할당한 메모리는 반드시 delete를 사용하여 해제해야한다. 만약 해제 하지 않으면 메모리 누수(memory leak)가 발생하게 되는데 스마트 포인터에서는 이러한 실수를 방지하기 위해 사용이 끝난 메모리를 자동으로 해제해주는 것 외에 다양한 기능을 제공한다.

  • 스마트 포인터의 장점은 다음과 같다.
    • 자동 매모리 해제 (예외가 발생해도 메모리를 해제해준다)
    • 포인터 자동 초기화
  • C++ 11 이전에는 스마트 포인터를 사용하기 위해 아래와 같이 new 키워드를 통해 객체를 만들고 auto_ptr 클래스에 담아서 사용하였다.

    1
    2
    3
    4
    5
    
    void Func()
    {
    	auto_ptr<T> p(new T);
    	p->print();
    }
    

    T라는 데이터 타입을 가리키는 auto_ptr 사용 예시

  • C++ 11 부터는 auto_ptr을 대체하기 위해 3가지의 스마트 포인터를 제공한다. 이 3가지 스마트 포인터는 참조 횟수(reference count)에 따라서 구별된다.

    참조 횟수 : 해당 메모리를 참조하는 포인터가 몇 개인지 나타내는 값, 참조 횟수가 0이 되면 메모리를 자동으로 해제한다.

    • unique_ptr : 참조 횟수가 1 인 스마트 포인터, 한 객체(가 가지는 메모리 주소) 당 하나의 포인터만 허용한다.
    • shared_ptr : 참조 횟수가 1 이상인 스마트 포인터.
    • weak_ptr : 객체를 참조를 해도 참조 횟수가 증가하지 않는 포인터. (스마트 포인터가 서로를 가리키면 영원히 참조 횟수가 0이 되지 않는 순환 참조가 발생하므로 이를 제거하기 위해서 사용된다 )
    1
    2
    3
    
    unique_ptr<T> p(new T);
    shared_ptr<T> p(new T);
    weak_ptr<T> p(new T);
    

    T라는 데이터 타입을 카리키는 3가지 스마트 포인터 사용 예시

[C++] 메모리 풀 (Memory Pool)

사용할 큰 메모리를 미리 할당하고 이를 작은 메모리 블록으로 나누어, 메모리가 필요할 때마다 이 블록을 건네주고, 다 사용한 블록은 돌려받는 기법.

  • 직접 구현하거나 apr_pool, boost::pool 과 같은 라이브러리를 통해 사용할 수 있다.
  • 다음과 같은 장점이 있다.
    • 잦은 할당/해제시 발생하는 비용을 줄여준다
    • 메모리 할당 시 실제로 몇 바이트를 할당 했는지 추가적으로 기록하는데, 이러한 메모리 사용을 줄여준다
    • 메모리 단편화 문제 해결
This post is licensed under CC BY 4.0 by the author.

벡터/리스트/데크

l-value, r-value, 람다 함수