상세 컨텐츠

본문 제목

스마트포인터

컴퓨터 언어/C++

by cepiloth 2020. 6. 22. 15:38

본문

728x90
반응형

 기존 C 스타일의 포인터 대신 스마트 포인터(SMART POINTER)를 사용하면 메모리와 관련하여 흔희 발생하는 문제를 방지할 수 있다. 스마트 포인터로 지정한 객체가 스코프를 벗어나면 메모리가 자동으로 해제 된다.

C++에서 가장 중요한 스마트 포인터 타입은 다음 두 가지다. 둘다 <memory> 헤더 파일에 정의돼 있으며 std 네임스페이스에 속해 있다.

std::unique_ptr;
std::shared_ptr;


 unique_ptr은 포인터로 가리키는 대상이 스코프를 벗어나거나 삭제될 때 할당된 메모리나 리소스도 자동으로 삭제된다는 점을 제외하면 일반 포인터와 같다. 그러나 unique_ptr이 가리키는 객체를 일반 포인터로는 가리킬 수 없다. unique_ptr은 return 문이 실행되거나 익셉션(EXCEPTION)이 발생하더라도 항상 할당된 메모리나 리소스를 해제할 수 있다는 장점이 있다. 그래서 함수에 return 문을 여러 개 작성하더라도 각각에 대해 리소스를 해제하는 코드를 작성할 필요가 없기 때문에 함수를 간결하게 작성할 수 있다.

//unique_ptr을 생성할 때는 반드시 std::make_unique<>를 사용해야 한다. 
//예를 들어 다음과 같이 작성하지 말고,
Employee* anEmployee = new Employee;
// ...
delete anEmployee;

//다음과 같이 make_unique<>()를 사용해서 작성해야 한다.
auto anEmployee = make_unique<Employee>();

 여기서 주목할 점은 delete가 자동으로 호출되기 때문에 delete를 호출하는 문장을 따로 적을 필요가 없다는 것이다. auto로 지정하면 컴파일러가 변수의 타입을 추론하기 때문에 타입을 구체적으로 지정할 필요가 없다.

unique_ptr은 제네릭 스마트 포인터라서 어떠한 종류의 메모리도 가리킬 수 있다. 그래서 템플릿으로 만든 것이다. 템플릿 매개변수를 꺽쇠괄호(<>)로 묶어서 지정하는데, unique_ptr에서는 여기에 가리키려는 메모리 타입을 지정한다. 

make_unique()는 C++14부터 추가 됐다. C++14를 지원하지 않는 컴파일러를 사용한다면 다음과 같은 방법으로 unique_ptr을 만든다.

unique_ptr<Employee> anEmployee(new Employee);


 기존에 사용하던 일반 포인터는 소유권과 관련이 없는 경우에만 사용한다. 그 외에는 unique_ptr을 기본으로 사용하고, 소유권을 공유할 필요가 있다면 shared_ptr을 사용한다. auto_ptr은 신경 쓸 필요 없다. C++11/14 버전부터 이미 폐기(deprecate) 됐고, C++17부터 완전히 제거(remove)됐다.

 

728x90
반응형

'컴퓨터 언어 > C++' 카테고리의 다른 글

타입추론  (0) 2020.06.22
Const 레퍼런스 전달 방식  (0) 2020.06.22
네임스페이스  (0) 2020.06.22
virtual inheritance in c++  (0) 2019.09.05
소멸자  (0) 2018.09.30

관련글 더보기

댓글 영역