Modern C++

[C++] SmartPointer - shared_ptr

태현123 2021. 7. 11. 16:28
728x90
반응형
SMALL

어제 알아봤던 unique_ptr에 이어서 shared_ptr에 대해 알아보도록 한다.

 

shared_ptr?

- 이름에 shared라는 문구가 붙었다. 이 의미는 무엇일까? 내 생각에는 unique와 반대로, 소유권을 공유할 수 있는 포인터인 것 같다. 찾아보니 그게 맞는 것 같다.

복사가 가능하다.

그럼 단순히 unique_ptr의 반대되는 개념일까?

궁금해서 인터넷을 찾아보았다.

 

shared_ptr의 특징?

- 포인터를 참조 카운팅을 통해 관리한다.

- shared_ptr는 내부적으로 자원의 주소와 참조 Counting을 수행할 제어블록을 가진다.

- 이 참조 Counting을 수행하는 제어블록이 있기 때문에, 하나 이상의 shared_ptr이 자원을 공유할 수 있다.

- 자원을 소유한 shared_ptr의 객체 수가 0이 되어 참조 Count가 0이 되면 소멸자를 호출하여 자원이 할당 해제 된다.

 

직접해봄.

shared_ptr Test

이렇게 하면, 처음에는 참조한놈이 p한놈밖에 없기 때문에 1을 출력할거고, 두번째로는 k가 p를 복사했으니 참조하는 애가 둘이되어 2가 출력될 것이다.

실행 결과

다음은 참조갯수가 0이 될때 소멸자가 호출되는지 확인하기 위해 작성한 코드이다.

이렇게 하면?

Test라는 클래스를 만들고, 생성자와 소멸자를 만들었다. 생성자와 소멸자에서는 생성자 호출 / 소멸자 호출 이라는 메시지를 띄우도록 하였다.

main문에서는 p변수를 shared_ptr<Test>로 만들어 선언해주었다. 그러면, 맨 처음에는 Test클래스의 생성자가 호출 될 것이다. 그리고, make_shared를 사용하여 현재 참조 카운트가 1이 될 것이다. 이후, k에서 p를 참조하게 되고 결국 p를 참조하는 카운트는 2가 될 것이다. 그리고 k를 reset, p를 reset해서 카운트가 0이 될 경우 소멸자가 호출될 것이다.

 

과연 결과는?

실행 결과

생각대로다. 얘는 참조하고 있는 포인터의 갯수에 따라서 소멸되는 포인터이다.

 

함수는 unique_ptr과 크게 다르지 않다.

 

shared_ptr의 경우 순환참조를 조심해야 한다.

-순환참조? >> 서로 맞물려서 참조하는 경우다.

순환 참조의 예

이렇게 하면 무슨일이 일어날까?

 

우선 실행 결과다.

실행결과

소멸자가 호출 되지 않았다.

왜?

-- 원인은 내부의 friend들의 경우 서로 참조하고 있어서 프로그램이 끝나도 해제가 되지 않았다.

이런 부분에 대해서 조심할 필요가 있다고 한다.

 

반응형
LIST

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

[C++] Container - List  (0) 2021.07.19
[C++] Container - array, vector  (0) 2021.07.18
[C++] SmartPointer - weak_ptr  (0) 2021.07.16
[C++] SmartPointer - unique_ptr  (0) 2021.07.10
C++ 11 복습 계획  (0) 2021.07.04