Posts

Showing posts with the label cpp_k

스마트 포인터 활용

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

스마트 포인터

Image
이 포스트는 C++11 의 shared_ptr 에 대한 것입니다 .  shared_ptr 의 사용법 , 장점 , 단점등을 살펴볼 것입니다 .  보통 shared_ptr 과 같은 스마트 포인터의 장점만을 인지하기 쉬운데 , 이 포스트를 통해 단점에 대한 의견 자유롭게 나눌 수 있게 된다면 좋겠습니다 . 스마트 포인터 ? 먼저 shared_ptr 같은 객체를 의미하는 스마트 포인터부터 설명을 하지 않을 수 없습니다 . 스마트 포인터는 동적 메모리 할당 시 delete 를 하지 않아 메모리 누수현상을 방지하기 위해 고안된 것입니다 . ‘ 자동으로 메모리를 관리해주는 포인터 ’ 가 가장 잘 들어맞는 말인 것 같습니다 . 밑의 예제와 같은 상황에서 스마트 포인터를 사용한다면 유용한 실수 방지 효과를 보실 수 있습니다 . normal_pointer 가 가리키는 할당된 힙메모리를 해제해 주지 않은 채로 다른 주소를 대입하고 있습니다 . 나중에 다시 쓸 메모리라면 다른 포인터에 저장해두어야 하고 , 필요 없는 메모리라면 delete 를 해주는 것이 바람직함에도 불구하고 , 이렇게 실수를 하는 경우가 자주 있습니다 .  동적 할당을 많이 사용하고 포인터를 자주 교환하다보면 메모리를 완벽하게 관리할 수 있다는 믿음은 오만일지도 모릅니다 . 메모리가 제대로 해제되는지 알아보기 위해 소멸자에 출력 명령어를 넣었습니다 .  위와 같이 스마트 포인터를 이용한다면 메모리를 따로 해제해주는 수고를 덜 수 있습니다 . 메모리 해제시점을 고민하지 않아도 되므로 다른 코드에 집중을 더 할 수 있게 됩니다 . 스마트 포인터는 <memory> 헤더에 정의되어있습니다 . unique_ptr unique_ptr 에 대해서는 짤막한 소개만하고 넘어가겠습니다 . unique_ptr 은 힙메모리를 스택메모리처럼 다룬다는 개념입니다 . 스택에 저장된 메모리는 스코프가 종료되면 같이 해...