[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 과 같은 라이브러리를 통해 사용할 수 있다.
- 다음과 같은 장점이 있다.
- 잦은 할당/해제시 발생하는 비용을 줄여준다
- 메모리 할당 시 실제로 몇 바이트를 할당 했는지 추가적으로 기록하는데, 이러한 메모리 사용을 줄여준다
- 메모리 단편화 문제 해결