스마트 포인터 활용
shared_ptr 의 활용법과 발생할 수 있는 문제와 해결방안을 살펴보겠습니다 . linked list, tree 같은 자료구조에서 smart pointer 의 아름다움을 한껏 느낄 수 있습니다 . 제가 자주 사용하는 방법인 트리구조에서의 활용을 살펴보겠습니다 . shared_ptr 을 배우기 전까지는 자식노드 정보를 저장하기 위해 일반적인 포인터를 사용하였을 것입니다 . Tree 와 같은 자료구조를 사용 시 , 일반적으로 각 노드들은 힙메모리에 할당되므로 보통 포인터 대신 shared_ptr 을 적용할 수 있습니다 . 보통 포인터가 아닌 shared_ptr 을 이용했을 때의 장점은 단연 메모리 해제에 있습니다 . 기존의 Node 클래스는 하위 노드부터 제거해나가야 하므로 , Tree 라는 래퍼클래스를 더 만들어 주어 후위 순회를 하며 메모리를 해제시켜주어야 합니다 . 하지만 shared_ptr 을 이용한 Node 클래스는 래퍼클래스가 필요하지도 , 소멸자에서 딱히 해줄 일도 없이 차근차근 메모리가 해제되는 기분 좋은 현상을 볼 수 있습니다 . 노드가 해제되면 shared_ptr 도 해제되고 , 뒤이어 그것이 가리키고 있던 메모리도 해제되기 때문입니다 . 자기를 가리키는 유일한 shared_ptr 이 없어짐으로써 자신도 해제되는 그림입니다 . 스마트 포인터의 장점을 한껏 보여줄 수 있는 예제로 충분합니다 . 주의사항이 있습니다 . 앞의 포스트 ( 스마트 포인터 ) 에서 살펴보았듯이 스마트포인터에는 스택메모리 주소를 보관해서는 안 됩니다 . 만약 스택에 할당된 메모리를 트리에 보관한다면 , 사용자의 의도와는 다르게 해제될 수 있고 , 하위 노드들에 대한 정보를 모두 잃어버릴 수 있습니다 . 그렇기에 만약 스택메모리에 할당된 정보를 트리구조로서 관리하고자 한다면 똑같은 복사본을 만들어 사용하는 수 밖에 없습니다 . 그리고 이것은 불필요한 정보...