C++ 노트 - 스마트 포인터

C++ 에서 unique_ptr, shared_ptr, weak_ptr 세 가지 종류의 스마트 포인터가 추가됨.
<memory> 헤더 파일에 저장되어 있음.

따로 delete를 해주지 않아도 해당 객체가 scope를 벗어나면 자동으로 메모리가 해제된다.
**scope를 벗어난다 = 지역 변수가 함수가 끝나 사라진다.

1. unique_ptr : 한번 선언된 객체를 다른 포인터가 가르킬 수 없음.

선언
unique_ptr<int> p(new int(5));
unique_ptr<int> p = make_unique<int>(5);

메소드
get() : 가르키는 주소를 반환.
reset() : 인자x = null포인터로 변환, 인자o = 새로운 값을 가르킴.
release() : 유니크 포인터를 다른 포인터 변수에게 넘겨주고, 유니크 포인터는 null로 바뀌게 됨.

2. shared_ptr : 하나의 객체에 대한 포인터 대입이 일어날 때마다 카운트가 증가함, scope를 벗어날 때마다 카운트가 감소, 카운트가 0이 되면 객체 삭제.

선언
shared_ptr<int> p(new int(5)); --> 카운터 변수의 메모리가 별개로 존재.
shared_ptr<int> p = make_shared<int>(5); --> 카운터 변수와 객체 같이 컨트롤.

메소드
use_count() : 카운트 값을 반환.
get() : 위와 동일
reset() : 포인터가 끊어지지만 카운트가 0이 아닌 이상 해당 객체가 사라지진 않음.

서로가 서로를 참조하는 순환 참조의 경우 카운트가 0이 되지 않아 메모리를 해제할 수 없는 단점이 있다.

3. weak_ptr : shared_ptr의 순환 참조를 피하기 위해 shared_ptr을 감시(?)하는 포인터.

선언
shared_ptr<int> p(s_ptr) --> s_ptr은 미리 선언된 shared_ptr, weak_ptr은 shared_ptr만을 참조할 수 있다.(해당 shared_ptr의 카운트는 증가x)

메소드
lock() : 참조중인 shared_ptr를 반환한다.
expired() : 참조중인 shared_ptr의 상태를 확인할 수 있다.

댓글

이 블로그의 인기 게시물

HTML - input file 버튼 꾸미기

HTML - 이미지 미리보기(jQuery 없이)

BOJ - DNA 유사도(2612)