기록공간

스마트 포인터 - 간략하게 본문

C++

스마트 포인터 - 간략하게

입코딩 2020. 4. 7. 22:13
반응형

이런저런 메모리 문제를 피하기 위해서는 기존 C언어 스타일의 일반 포인터 대신 스마트 포인터를 사용해야 한다. 스마트 포인터는 객체에 유효한 스코프가 더 이상 없을 때(함수의 리턴 등으로 스코프를 벗어날 때) 자동으로 메모리를 해제한다.

 

C++ 스마트 포인터는 세 종류가 있다. std::unique_ptr, std::shared_tr, std::weak_ptr로 모두 <memory> 헤더 파일에 정의되어 있다. 

 

unique_ptr은 보통의 포인터와 비슷하나 스코프를 벗어날 때 자동으로, 또는 명시적으로 delete가 수행될 때 메모리를 해제하는 것에 차이가 있다. unique_ptr을 이용하면 예외 상황이 발생하였을 때 메모리 해제를 단순하게 할 수 있다. unique_ptr은 객체뿐만 아니라 C 스타일 배열을 넣을 수도 있다. unique_ptr을 만들 때는 std::make_unique<>()를 이용한다.

// Employee* anEmployee = new Employee // <-- 기존 방식
auto anEmployee = std::make_unique<Employee>() // <-- 스마트포인터

make_unique()는 C++14부터 사용 가능하다. 만약 컴파일러가 C++14를 지원하지 않는다면 아래와 같은 방식을 사용해야 한다.

std::unique_ptr<Employee> anEmployee(new Employee);

변수 anEmployee는 스마트 포인터가 된다. 사용법은 일반 포인터와 같다.

 

unique_ptr은 범용 스마트 포인터로, 어떤 종류의 메모리든 참조가 가능하다. 템플릿으로 만들어진 이유가 여기에 있다. 

 

shared_ptr은 데이터에 대한 오너십이 여기 저기 분산될 수 있게 해준다. shared_ptr 변수가 다른 변수에 대입될 때마다 레퍼런스 카운트가 증가되어 데이터의 오너가 하나 더 늘었다는 것을 표시한다. shared_ptr 변수는 모든 스코프를 벗어나면 레퍼런스 카운트가 0이 되고, 이는 오너가 없다는 뜻으로 포인터를 참조되고 있던 객체의 메모리가 해제된다. shared_ptr은 배열을 지원하지 않는다. shared_ptr을 생성할 때는 std::make_shared<>()를 이용한다.

 

weak_ptr은 shared_ptr에 대입된 객체를 참조하되 레퍼런스 카운트에 영향을 주고 싶지 않을 때 사용한다.

반응형

'C++' 카테고리의 다른 글

std::getline()을 이용한 string 표준입력  (0) 2020.06.25
예외 처리  (0) 2020.04.21
decltype 키워드  (0) 2020.04.03
자동 함수 리턴 타입 (C++14)  (0) 2020.04.03
새로운 함수 정의 문법(C++11)  (0) 2020.04.03
Comments