일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 관심지향프로그래밍
- 아펠가모
- 스페인
- b-tree index
- @Component
- db index
- 스프링 AOP
- 아펠가모선릉
- sprintboot
- 세비야
- kotiln
- 마드리드
- c# scv
- HTTP #웹기술
- 코프링
- 코틀린
- 아펠가모 선릉
- 본식후기
- git명령어
- 그라나다
- 코틀린 함수
- 바르셀로나
- Kotlin
- elk
- kopring
- Srping AOP
- 스페인 준비물
- http상태코드
- HTTP
- 400에러
- Today
- Total
끄적이는 메모장
[C++11] shared_ptr / weak_ptr 본문
#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
wp1은 p1과 동일한 메모리 영역 가르키지만 소유권은 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 |