Modern C++/Smart Pointer
-
스마트 포인터 참조 가이드(Smart Pointer Referece Guide)Modern C++/Smart Pointer 2020. 7. 12. 20:11
1. new를 이용한 동적 객체 생성은 피하되 필요한 경우 스마트 포인터를 사용하라. 스택을 사용하고 할당연산자나 이동/복사 연산을 사용하는게 객체의 수명 관리가 편해 코드가 어떻게 동작하는 지 예측하기 편하다. 동적 할당은 메모리를 힙에 할당하는 데 비용이 드는 것 뿐 만 아니라 메모리의 위치가 연속적이지 않아 컴파일러가 코드의 최적화를 수행하는 데 걸림돌이 되기도 한다. 메모리 할당은 필요할 때만 해야하고 new/delete를 직접 사용하지 않고 스마트 포인터를 사용하면 메모리를 직접 관리해야 하는 부담을 줄일 수 있다. 2. 스마트 포인터 선택 시 가장 먼저 std::unique_ptr 사용을 고려하라. 동적 메모리 할당이 필요한 경우 우선적으로 std::unique_ptr 사용을 고려한다. std..
-
2. std::shared_ptr 과 std::weak_ptrModern C++/Smart Pointer 2020. 7. 12. 17:07
std::shared_ptr 동적 할당된 객체의 소유권을 공유할 때 std::shared_ptr를 이용해 메모리를 관리한다. 메모리 해제 시점은 동적 객체를 가리키는 모든 공유 포인터가 더 이상 해당 객체를 가리키지 않을 때로 더 이상 공유 포인터가 가리키는 객체의 수명에 대해 신경 쓸 필요가 없어진다. 이렇게 메모리가 해제되는 시점은 원자적 참조 횟수(atomic reference count)를 통해 공유 포인터 생성 시 카운트를 증가시키고, 소멸 시 카운트를 감소시킨다. 복사 배정 연산자의 경우 증가와 감소가 모두 일어난다. 참조 횟수는 제어 블록(control block)에서 관리하며 공유 포인터의 대략적인 구조는 아래와 같다. 위와 같이 공유 포인터는 객체를 가리키는 포인터와 별개로 제어블록을 가..
-
1. std::unique_ptrModern C++/Smart Pointer 2020. 7. 2. 18:39
C++ 메모리 관리 C++에서 생 포인터(raw pointer)를 관리하기는 쉽지 않다. 자바는 가비지 콜렉터가 이를 수행하지만 C++같은 경우 사용자가 직접 메모리를 관리해야 한다. 잘못된 메모리 관리는 메모리 릭이 발생하거나 더블 프리 문제로 프로그램이 예외를 던지고 프로그램이 종료하기도 한다. 여기서 생 포인터를 사용하기 어려운 이유를 살펴 보기로 하자. struct Data { uint8_t *data_; size_t length_; }; 여기서 data_는 하나의 객체를 가리키는 포인터인지 배열을 가리키는 포인터인지 코드 자체로는 구별할 수 없다. 생성자에는 uint8_t 형 배열 포인터와 해당 배열의 크기를 받는 생성자와 소멸자를 추가해보자. struct Data { Data(const uin..