일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 오블완
- 스마트 포인터
- 참조자
- 반복자
- Smart Pointer
- 상속
- 영화 리뷰
- effective modern c++
- resource management class
- 티스토리챌린지
- implicit conversion
- 게임
- effective stl
- 암시적 변환
- universal reference
- more effective c++
- iterator
- 영화
- std::async
- Effective c++
- c++
- 보편 참조
- lua
- virtual function
- reference
- 언리얼
- exception
- UE4
- 예외
- operator new
- Today
- Total
목록스마트 포인터 (7)
스토리텔링 개발자
항목 21. new를 직접 사용하는 것보다 std::make_unique와 std::make_shared를 선호하라 특징std::make_shared는 C++11에서 표준에 포함되었다.std::make_unique는 C++14에서 표준에 포함되었다.허나 make_unique를 만드는 건 어렵지 않다.// 배열 버전은 지원하지 않지만, 쉽게 지원하도록 추가할 수 있을 것이다.// std namespace에 넣진 말자. 14가 되면 충돌할 것이다.templatestd::unique_ptr make_unique(Ts&&... params){ return std::unique_ptr(new T(std::forward(params)...));}스마트 포인터를 리턴하는 make 함수는 한 가지 더 있다.s..

항목 18. 소유권 독점 자원의 관리에는 std::unique_ptr를 사용하라 std::unique_ptrraw 포인터와 같은 크기라고 가정할 수 있다.대부분의 연산에서 raw 포인터와 동일한 명령들을 실행한다.독점적 소유권(exclusive ownership) 의미론을 토대로 구현되어 있다.널이 아닌 std::unique_ptr는 항상 자신이 가리키는 객체를 소유하고 있다.이동하면 소유권은 옮겨지고, 기존 포인터는 널로 설정된다.소유권 문제로 복사는 허용되지 않는다.즉, 이동 전용 타입(move-only type)이다.두 가지 타입이 존재한다.개별 객체를 위한 타입(std::unique_ptr)operator[] 를 제공하지 않는다.배열을 위한 타입(std::unique_ptr)operator*와..
항목 29. 참조 카운팅(Reference Counting) 참조 카운팅이란여러 개의 객체들이 똑같은 값을 가졌으면, 각각이 하나의 데이터를 공유하게 하여, 데이터의 양을 절약하는 기법이다. 참조 카운팅의 동기힙 객체의 관리를 편하게 하기 위함이다.힙에 할당된 객체는 소유권을 추적하는 일이 상당히 까다롭다.하지만 참조 카운팅을 사용하면 소유권을 일일이 추적하지 않아도 된다.똑같은 값을 가지고 있는 객체들이 값을 각각 가지게 되면 낭비이다. 참조 카운팅 기본 구현법class String{public: // 생성자 String(const char* initValue = ""); String(const String& rhs); // 소멸자 ~String(); ..
항목 28. 스마트 포인터(Smart Pointer) 스마트 포인터를 사용하는 이유생성과 소멸 작업을 조절할 수 있다.스마트 포인터가 생성되고 소멸되는 시기를 사용자가 결정할 수 있다.초기값을 스마트 포인터가 컨트롤하므로, 쓰레기값 문제가 없다.객체를 알아서 소멸시켜주므로 리소스 누수가 없다.복사와 대입 동작을 조절할 수 있다.스마트 포인터가 복사되고 대입될 때의 일을 사용자가 결정할 수 있다.깊은 복사와 얕은 복사를 원하는 대로 정의할 수 있다.혹은 복사 대입을 전혀 사용하지 못하도록 막을 수도 있다.역참조 동작을 조절할 수 있다.스마트 포인터가 가리키는 객체를 가져오려고 할 때 일어나는 일을 결정할 수 있다.지연 방식 데이터 / 명령어 가져오기(fetching)(항목 17 참조) 스마트 포인터..
항목 9 : 리소스 누수를 피하는 방법의 정공은 소멸자이다. 지역 리소스에 대한 포인터지역 리소스(스택에서 생긴 리소스)를 조작할 때, 포인터는 부적절할 수 있다.소멸자가 불리지 않는 상황이 발생할 수 있기 때문이다.즉, 리소스 누수가 발생할 수 있다는 뜻이다.class ALA{public: virtual void processAdoption() = 0; ...};class Puppy : public ALA{public: virtual void processAdoption(); ...};class Kitten : public ALA{public: virtual void processAdoption(); ...};// s로부터 동물 정보를 읽어서// 적절한 타입의 객체를..
항목 17. new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 맞추자 매개변수 평가다음 코드는 자원을 흘릴 가능성이 있다.void processWidget(shared_ptr pw, int priority);...processWidget(shared_ptr(new Widget), priority());컴파일러는 호출 코드를 만들기 전, 매개변수로 넘겨지는 인자를 평가한다.두 번째 인자(priority 함수)는 호출문 뿐이다.첫 번째 인자(shared_ptr(new Widget)은 두 부분으로 나뉘어져 있다."new Widget" 표현식을 실행하는 부분shared_ptr 생성자를 호출하는 부분그러므로 컴파일러는 다음 세 가지 연산을 위한 코드를 생성한다.priority를 호출한..
개요메모리 관리는 C++의 난점 중 하나입니다. 스택에 할당된 메모리는 범위만 잘 지켜주면 대부분은 괜찮지만,힙에 할당한 메모리는 물가에 내놓은 갓난 아이처럼 끝까지 잘 지켜봐 줘야 합니다.자칫 잘못하면 그대로 소중한 메모리의 누수로까지 이어집니다. 좀 더 편하게 메모리 관리를 할 수 있는 방법은 없을까요? 그런 고민에서 생겨난 것이 이름처럼 스마트한 스마트 포인터입니다. 이 스마트 포인터는, 이젠 준 필수 기능이 되었습니다.이전까진 시험적으로 사용해오다가, 모던 C++부터는 정식 라이브러리에 완전히 편입되기까지 했죠. 또한 언리얼 역시 이 C++ 라이브러리가 제공하는 스마트 포인터와 거의 동일한 것을 제공하고 있습니다. 오늘 이야기해 볼 것이 이 언리얼의 스마트 포인터 입니다. 스마트 포인터의 종류..