끄적이는 메모장

[C++11] shared_ptr / weak_ptr 본문

C, C++, C#/C++ 공부

[C++11] shared_ptr / weak_ptr

밥보92 2018. 5. 30. 14:48
반응형

#shared_ptr

 

객체의 소유권을 다른 포인터와 공유 가능 -> 복사가 가능

reference count가 존재하는데 포인터가 복사될 때마다 1씩 증가하는 것으로 이해가능

그리고 참조가 사라질 때마다 1씩 감소하는데, reference count가 0이 되었을때 메모리가 해제된다.

 

shared_ptr<double> p1(new double(1.0)); -> reference count - 1

auto p2 = p1; -> reference count - 2

 

use_count :  현재의 reference count 값을 알 수 있다.

ex ) p2.use_count()  => 2

 

shared_ptr 객체가 복사 되는데 사용되는 메모리 크기는 어떻게 될까 ? -> 답은 증가 되지 않는다!

단지 증가 되는 것은 reference count 뿐이다.

 

각각의 shared_ptr 참조를 해제할 때는 reset을 이용한다.

 

p2.reset() -> reference count - 1

p1.reset() -> reference count - 0 / 객체가 완전히 해제됨 !!

 

멀티쓰레드 프로그램 시 동일 객체를 참조 할때, 쓰기에 주의 해야한다.

 

#weak_ptr

 

shared_ptr의 경우 순환 참조의 문제가 발생 할 수도 있다.

이때, 메모리 해제의 문제가 발생할 수 있는데 이 문제를 없애기 위해 준비 된 것이 weak_ptr이다.

weak_ptr은 shared_ptr을 참조하여 관리 하지만 reference count에는 영향을 받지 않는다.

 

shared_ptr<double> p1(new double(1.0)); -> reference count - 1

weak_ptr<double> wp1 = p1; -> reference count - 1

 

wp1p1과 동일한 메모리 영역 가르키지만 소유권은 p1만 가지고 있음

 

lock() 은 특정 영역 내에서 자기가 가르키고 있는 shared_ptr을 반환해주고 reference count를 중가시킨다.

{

    shared_ptr<double> p2 = wp1.lock(); -> reference count - 2 

    ...

}

 

그리고 p2는 영역을 벗어나는 즉시 참조가 해제되며 reference count도 감소하게 된다 .

즉, weak_ptr을 이용하여 일정 영역에서만 참조가 가능하도록 하여 순환 참조를 해결 할 수 있도록 할 수 있다.

 

좋은 예시가 있는 것 같다. https://blog.koriel.kr/cpp11-smart-pointer/

반응형

'C, C++, C# > C++ 공부' 카테고리의 다른 글

[C++11] range for loop  (0) 2018.05.30
[C++11] make_shared  (0) 2018.05.30
[C++11] unique_ptr / smart pointer  (0) 2018.05.30
[C++11] nullptr  (0) 2018.05.30
[C++11] static_assert  (0) 2018.05.30