본문 바로가기

분류 전체보기44

20. std::shared_ptr 처럼 작동하되 대상을 잃을 수 도 있는 포인터가 필요하면 std::weak_ptr을 사용하라. - std::shared_ptr처럼 작동하되 대상을 잃을 수도 있는 포인터가 필요하면 std::weak_ptr를 사용하라. 대체로 std::weak_ptr는 std::shared_ptr를 이용해서 생성한다. std::weak_ptr는 자신을 생성하는 데 쓰인 std::shared_ptr가 가리키는 것과 동일한 객체를 가리키나, 그 객체의 참조 카운트에는 영향을 주지 않는다. 대상을 잃은 std::weak_ptr를 가리켜 만료되었다(expired)라고 말한다. std::weak_ptr의 만료 여부는 멤버 함수 expired가 돌려주는 값으로 판단할 수 있다. 만료되지 않은 std::weak_ptr이라고 해도 피지칭 객체에 직접 접근하는 것은 불가능하다. std::weak_ptr에는 역참조 연산이 없기 때문.. 2021. 3. 11.
19. 소유권 공유 자원의 관리에는 std::shared_ptr을 사용하라. - std::shared_ptr는 임의의 공유 자원의 수명을 편리하게(가비지 컬렉션에 맡길 때만큼이나) 관리할 수 있는 수단을 제공한다. std::shared_ptr가 할 수 없는 일로는 배열 관리가 있다. std::unique_ptr와는 다르게, std::shared_ptr의 API는 단일 객체를 가리키는 포인터만 염두에 두고 설계되었다. std::shared_ptr로 배열을 가리키되, 배열 삭제를 수행하는 커스텀 삭제자를 지정하면 되지 않겠느냐는 발상을 할 수도 있다. 그런 코드가 컴파일되긴 하지만, 그리 좋은 발상은 아니다. 한 가지 이유는, std::shared_ptr는 operator[]를 제공하지 않는다는 것이다. 또 다른 이유로, std::shared_ptr가 지원하는 파생 클래스 포인터에서.. 2021. 3. 9.
18. 소유권 독점 자원의 관리에는 std::unique_ptr을 사용하라. - std::unique_ptr는 독점 소유권 의미론을 가진 자원의 관리를 위한, 작고 빠른 이동 전용 스마트 포인터이다. std::unique_ptr는 기본적으로 생 포인터와 같은 크기라고 가정할 수 있으며, 대부분의 연산(역참조를 비롯해서)에서 생 포인터와 정확히 동일한 명령들을 실행한다. std::unique_ptr는 독점적 소유권(exclusive ownership) 의미론을 재현하고 있다. 널이 아닌 std::unique_ptr는 항상 자신이 가리키는 객체를 소유한다. std::unique_ptr를 이동하면 소유권이 원본 포인터에서 대상 포인터로 옮겨진다(원본 포인터는 널로 설정된다). std::unique_ptr의 복사는 허용되지 않는다. 만일 복사가 허용되면, 두 std::unique_ptr.. 2021. 3. 9.
17. 특수 멤버 함수들의 자동 작성 조건을 숙지하라. - 컴파일러가 스스로 작성할 수 있는 멤버 함수들, 즉 기본 생성자와 소멸자, 복사 연산자들, 이동 연산자들을 가리켜 특수 멤버 함수라고 부른다. 1. 기본 생성자 : C++98의 규칙들과 같다. 클래스에 사용자 선언 생성자가 없는 경우에만 자동으로 작성된다. 2. 소멸자 : C++98의 규칙들과 본질적으로 같다. 유일한 차이점은 소멸자가 기본적으로 noexcept라는 점이다. C++98처럼 기본적으로 작성되는 소멸자는 오직 기반 클래스 소멸자가 가상일 때에만 가상이다. 3. 복사 생성자 : 실행시점 행동은 C++98의 것과 같다. 즉, 비정적 데이터 멤버들을 멤버별로 복사 생성한다. 클래스에 사용자 선언 복사 생성자가 없을 때에만 자동으로 작성된다. 클래스에 이동 연산이 하나라도 선언되어 있으면 삭제(.. 2021. 3. 9.