-
항목18. 소유권 독점 자원 관리는 std__unique_ptr를 사용하라Effective Modern C++ 2022. 8. 3. 20:23
std::unique_ptr의 특징
- 생 포인터와 같은 크기이고 거의 비슷한 일을 한다.(물론 예외도 있음)
- 독점적 소유권, 항상 자신이 가리키는 객체를 소유함(널이 아니면)
- 복사를 허용하지 않고, 이동 전용 형식임
- 소멸시 자신이 가리키는 자원을 파괴, 자원 파괴는 내부의 생 포인터에 delete를 적용함
- std::unique_ptr에서 std::shared_ptr로의 변환이 쉽고 효율적임
커스텀 삭제자의 특징
- 커스텀 삭제자를 사용할 때에는 그 형식을 std::unique_ptr의 둘째 형식 인수로 지정해야함
std::unique_ptr<Investment, decltype(delInvmt)>- 생 포인터(이를테면 new를 통해 얻은 포인터)를 std_unique_ptr에 배정하는 문장은 컴파일 되지않음. 이 때문에, new로 생성한 객체의 소유권을 std::unique_ptr에 부여하기 위해 reset을 호출함
pInv.reset(new Widget(std::forward<Ts>(params)...));- 파생 클래스의 객체를 파괴할 때 기반 클래스 포인터로서 delete됨. 이것이 제대로 작동하려면 기반 클래스의 소멸자가 가상 소멸자이어야 함
class Investment { public: ... virtual ~Investment(); ... };- 커스텀 삭제자를 함수 포인터로 사용하면 std::unique_ptr의 크기가 커짐. 이를 해결하려면 상태 없는 람다 표현식으로 구현하는 것이 이득인 경우가 많음.(크기 변화 없음)
/// 상태 없는 람다 형태의 삭제자 auto delInvmt = [](Investment* pInvestment) { ... delete pInvestment; }'Effective Modern C++' 카테고리의 다른 글
항목20. std::shared_ptr처럼 작동하되 대상을 잃을 수도 있는 포인터가 필요하면 std::weak_ptr을 사용하라 (0) 2022.08.11 항목19. 소유권 공유 자원의 관리에는 std__shared_ptr를 사용하라 (0) 2022.08.05 항목17. 특수 멤버 함수들의 자동 작성 조건을 숙지하라. (0) 2022.07.29 항목16. const멤버 함수를 스레드에 안전하게 작성하라 (0) 2022.07.29 항목15. 가능하면 항상 constexpr을 사용하라 (0) 2022.07.28