Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 델리게이트
- stl
- 강참조
- 프로그래머스
- 정렬알고리즘
- moreeffectiveC++
- BFS
- 정렬
- 자료구조
- 람다사용정렬
- 람다
- 언리얼가비지컬렉터
- 크리티컬섹션
- enumasByue
- 약참조
- map
- 선택정렬
- UML관련
- 데이터애셋
- dataasset
- 알고리즘
- 스마트포인터
- UE4 커스텀로그
- UE_LOG
- C++최적화
- 애셋로드
- 언리얼엔진구조체
- UELOG
- C++
- unorder_map
Archives
- Today
- Total
기억을 위한 기록들
[CPP]스마트(Smart) 포인터에 관하여(3) - weak_ptr 본문
이전에 공유 포인터의 서로 공유하면서 해제되지 않는 순환 참조가 발생하면서, 그것을 해결해주게 도와주는것이 weakptr 약한 포인터이다. 약한 포인터에는 공유 포인터의 강한참조외에 약한 참조가 존재하는데,
약한참조란?
- 원시 포인터 해제에 영향을 끼치지 않음.
- 약한 참조 카운트는 약한 참조의 수를 저장하는데 사용.
- 약한 참조로 참조되는 개체는 강한 참조 카운트가 0이 될때, 소멸됨.
- 순환 참조 문제의 해결책
* 공유 포인터에서부터 약한 포인터를 만든다.
#include <memory>
#include "Person.h"
int main()
{
std::shared_ptr<Person> owner = std::make_shared<Person>("LaLa"); //강한참조
std::weak_ptr<Person> weakOwner = owner; //약한 참조
//위크 포인터는 그냥 나오는게 아니라 강한참조에서 만든다.
return 0;
}
공유 포인터에서는 강한참조(1 strong ref)만 있었으나, 약한 포인터를 사용하게 되면 약한 참조(1weak ref)가 생긴걸 확인 할 수 있다. 동일하게 참조할수 있고, 더 안전하고, 강한참조의 갯수를 늘리지 않고 별도의 약한 참조(1weak ref) 의 갯수를 늘린다.
이것은 강한참조가 0이되면은 약한참조가 1이더라도 메모리에서 소멸하게 된다.
그리고 약한참조 혼자 원시포인터를 참조할 순 없다.
* 약한 포인터로 공유 포인터 만들기
(원시 포인터가 존재하면 공유 포인터를 만든다. -lock())(접근 제한)
#include <memory>
#include "Person.h"
int main()
{
std::shared_ptr<Person> owner = std::make_shared<Person>("LaLa");
std::weak_ptr<Person> weakOwner = owner;
std::shared_ptr<Person> lockedOwner = weakOwner.lock();
return 0;
}
* 공유 포인터가 존재하는지 확인
#include <memory>
#include "Person.h"
int main()
{
std::shared_ptr<Person> owner = std::make_shared<Person>("LaLa");
std::weak_ptr<Person> weakOwner = owner;
auto ptr = weakOwner.lock();
if(ptr == nullptr) //강한참조 없으면 null 된다.
{
//..
}
return 0;
}
std::shared_ptr
- 강한 참조
- 강한 참조 카운트를 늘림
- 직접적으로 사용할 수 있음
- 원시 포인터가 확실히 존재하기 때문
std::weak_ptr
- 약한 참조
- 약한 참조 카운트를 늘림
- 직접적으로 사용할 수 없음
- lock을 써서 공유 포인터가 여전히 존재하는지 확인 해야함.
'C & CPP > Smart Pointer' 카테고리의 다른 글
[CPP]스마트(Smart) 포인터에 관하여(2) - shared_ptr (0) | 2021.02.18 |
---|---|
가비지 컬렉션/참조 카운팅에 관하여 (0) | 2021.02.18 |
[CPP]스마트(Smart) 포인터에 관하여(1) - unique_ptr (0) | 2021.02.16 |