지금까지 c를 위주로 코딩했더니 c++을 쓸줄 안다고 하면서도 생각보다 모르는 부분이 많다는 것을 깨달았다. 그래서 마침 코드 읽을 일도 생겼을 겸 따로 공부좀 해야 될 것 같다.
smart pointerc/c++로 프로그래밍을 하다보면 메모리 이슈가 많이 생긴다. 할당한 메모리를 해제해주지 않아 생기는 메모리 누수문제도 이에 해당한다. 물론 프로그래머가 모든 경우의 수를 생각하고 프로그래밍을 할 수 있다면 큰 문제가 아닐 수 있다. 하지만 사람은 항상 실수를 하기 마련이다.
일반적으로 객체를 생성하면 함수를 빠져나가면서 소멸자의 호출로 인해 소멸된다. 하지만 포인터를 이용할 경우 객체가 이니기 때문에 소멸자가 호출되지 않는다. 그래서 생각한 것이 스마트 포인터라는 개념이다. 포인터'객체'를 만들어 자신이 가리키고 있는 데이터를 같이 delete 된다.
unique_ptr스마트 포인터 중 1개인 unique_ptr은 메모리 관련 이슈 중 double free 버그를 해결하는 포인터 객체다. 딱 이 문제를 해결한다기 보단 객체의 소유권을 부여한다고 한다.
void function(){
std::unique_ptr\ p_a(new A());
}
위 예제 코드에서 함수를 빠져나오게 되면 클래스 A에서 메모리할당이 일어나도 소멸자로 인해 메모리가 해제된다.
void function(){
std::unique_ptr<A> p_a(new A());
std::unique_ptr<A> pp_a = p_a; // compile error!
std::unique_ptr<A> pp_a = move(p_a); // correct!
}
따라서 위 예제코드처럼 move라는 소유권 이전을 할순 있지만 pp_a에 p_a를 복사할 순 없다. 이런 기능을 이용해 프로그래머의 실수를 줄일 수 있다.
shared_ptrshared pointer는 unique pointer와 같이 smart pointer 종류 중 하나이다. 다만 차이점은 unique_ptr 와는 다르게 두개 이상의 포인터가 단일 객체를 가리킬 수 있다
void function(){
std::unique_ptr<A> p_a(new A());
std::unique_ptr<A> p_a2(p_a); // compile error
std::shared_ptr<B> p_b(new B());
std::shared_ptr<B> p_b2(p_b);
}
unique_ptr을 이용할 경우 유일한 소유권만 인정되기 때문에 컴파일 오류가 발생한다. 한지만 shared_ptr의 경우 단일 객체를 여러 포인터가 가리킬 수 있다. 다만 객체의 소멸자는 reference count 가 0이 되어야만 호출되기 때문에 주의해야한다.

댓글 없음:
댓글 쓰기