일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 알고리즘
- 스케줄링
- 동적계획법
- 쓰레드
- DirectX12
- 영속성
- 락
- 멀티쓰레드
- 그리디알고리즘
- 파일시스템 구현
- 백준
- 그리디 알고리즘
- 병행성
- 운영체제
- I/O장치
- OS
- codility
- DirectX 12
- 다이나믹프로그래밍
- 병행성 관련 오류
- 컨디션 변수
- 프로그래머스
- directx
- 디자인패턴
- Direct12
- 멀티프로세서
- 타입 객체
- 렌더링 파이프라인
- 다이나믹 프로그래밍
- 자료구조
- Today
- Total
기록공간
스마트 포인터 - 간략하게 본문
이런저런 메모리 문제를 피하기 위해서는 기존 C언어 스타일의 일반 포인터 대신 스마트 포인터를 사용해야 한다. 스마트 포인터는 객체에 유효한 스코프가 더 이상 없을 때(함수의 리턴 등으로 스코프를 벗어날 때) 자동으로 메모리를 해제한다.
C++ 스마트 포인터는 세 종류가 있다. std::unique_ptr, std::shared_tr, std::weak_ptr로 모두 <memory> 헤더 파일에 정의되어 있다.
unique_ptr은 보통의 포인터와 비슷하나 스코프를 벗어날 때 자동으로, 또는 명시적으로 delete가 수행될 때 메모리를 해제하는 것에 차이가 있다. unique_ptr을 이용하면 예외 상황이 발생하였을 때 메모리 해제를 단순하게 할 수 있다. unique_ptr은 객체뿐만 아니라 C 스타일 배열을 넣을 수도 있다. unique_ptr을 만들 때는 std::make_unique<>()를 이용한다.
// Employee* anEmployee = new Employee // <-- 기존 방식
auto anEmployee = std::make_unique<Employee>() // <-- 스마트포인터
make_unique()는 C++14부터 사용 가능하다. 만약 컴파일러가 C++14를 지원하지 않는다면 아래와 같은 방식을 사용해야 한다.
std::unique_ptr<Employee> anEmployee(new Employee);
변수 anEmployee는 스마트 포인터가 된다. 사용법은 일반 포인터와 같다.
unique_ptr은 범용 스마트 포인터로, 어떤 종류의 메모리든 참조가 가능하다. 템플릿으로 만들어진 이유가 여기에 있다.
shared_ptr은 데이터에 대한 오너십이 여기 저기 분산될 수 있게 해준다. shared_ptr 변수가 다른 변수에 대입될 때마다 레퍼런스 카운트가 증가되어 데이터의 오너가 하나 더 늘었다는 것을 표시한다. shared_ptr 변수는 모든 스코프를 벗어나면 레퍼런스 카운트가 0이 되고, 이는 오너가 없다는 뜻으로 포인터를 참조되고 있던 객체의 메모리가 해제된다. shared_ptr은 배열을 지원하지 않는다. shared_ptr을 생성할 때는 std::make_shared<>()를 이용한다.
weak_ptr은 shared_ptr에 대입된 객체를 참조하되 레퍼런스 카운트에 영향을 주고 싶지 않을 때 사용한다.
'C++' 카테고리의 다른 글
std::getline()을 이용한 string 표준입력 (0) | 2020.06.25 |
---|---|
예외 처리 (0) | 2020.04.21 |
decltype 키워드 (0) | 2020.04.03 |
자동 함수 리턴 타입 (C++14) (0) | 2020.04.03 |
새로운 함수 정의 문법(C++11) (0) | 2020.04.03 |