일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- C++최적화
- stl
- 약참조
- 강참조
- C++
- dataasset
- moreeffectiveC++
- 델리게이트
- 람다
- 정렬알고리즘
- unorder_map
- enumasByue
- UELOG
- UML관련
- map
- 언리얼가비지컬렉터
- 언리얼엔진구조체
- 정렬
- 스마트포인터
- UE4 커스텀로그
- 자료구조
- 알고리즘
- 프로그래머스
- 크리티컬섹션
- 선택정렬
- 람다사용정렬
- UE_LOG
- BFS
- 데이터애셋
- 애셋로드
- Today
- Total
목록C & CPP/Smart Pointer (4)
기억을 위한 기록들
이전에 공유 포인터의 서로 공유하면서 해제되지 않는 순환 참조가 발생하면서, 그것을 해결해주게 도와주는것이 weakptr 약한 포인터이다. 약한 포인터에는 공유 포인터의 강한참조외에 약한 참조가 존재하는데, 약한참조란? - 원시 포인터 해제에 영향을 끼치지 않음. - 약한 참조 카운트는 약한 참조의 수를 저장하는데 사용. - 약한 참조로 참조되는 개체는 강한 참조 카운트가 0이 될때, 소멸됨. - 순환 참조 문제의 해결책 * 공유 포인터에서부터 약한 포인터를 만든다. #include #include "Person.h" int main() { std::shared_ptr owner = std::make_shared("LaLa"); //강한참조 std::weak_ptr weakOwner = owner; //..
shared_ptr 공유포인터로 이전에 유니크 포인터와 달리 원시포인터를 독차지 하지 않고 여럿이서 공유 할 수있다. 몇명(?)이서 공유하는지 확인하기 위해 참조카운팅 기반으로 작동이 된다. 참조 카운팅이란 이전에 작성한 글이 있다. 사용예를 보면, #include #include "myVector.h" int main() { std::shared_ptr vector01 = std::make_shared(10.f, 30.f); // ... } 위와같이 생성하면 1 강한 참조 (1 strong ref)가 표시되는걸 확인할 수 있다. shared_ptr 내부 - 두개의 포인터를 소유 1. 데이터(원시 포인터)를 가리키는 포인터 2. 제어 블록을 가리키는 포인터(참조카운팅용) - 유니크 포인터와 달리 shar..
가비지 컬렉터는? - 메모리 누수를 막으려는 시도를 해준다. - 주기적으로 컬렉션을 실행. - 충분한 여유 메모리가 없을 때 컬렉션이 실행됨 (스케쥴에 따라 또는 수동으로도 실행가능) - 매 주기마다,GC는 루트("root")를 확인함 1. 전역변수 2. 스택 3. 레지스터 - 힙에 있는 개체에 루트를 통해 접근할 수 있는지 판단 - 접근할 수 없다면, 가비지로 간주해서 해제 문제점? - 사용되지 않는 메모리를 즉시 정리하지 않음. - GC가 메모리를 해제해야 하는지 판단하는 동안 애플리케이션이 멈추거나 버벅일 수 있음. 참조 카운팅? - 가비지컬렉션처럼, 개체에 대한 참조가 없을 때 개체가 해제됨. - 언제든 참조 횟수를 활용해서 특정 개체가 몇 번이나 참조되고 있는지 판단 가능 - 어떤 개체 A를 다..
스마트 포인터는 3가지가 있다. - unique_ptr (유니크) - shared_ptr (쉐어드) - weak_ptr (위크) 우선 일반 포인터를 보면 //... int main() { Vector* myVector = new Vector(10.f, 30.f); //... delete myVector; return 0; } 이런식으로 delete를 해줘야 한다. 그러나 //... int main() { Vector* myVector = new Vector(10.f, 30.f); if(true) { return 0; //early return } delete myVector; return 0; } 중간에 끝나버리거나(try catch와 같은), delete을 잊으면 메모리 누수(memory leak)가 ..