-
항목21. new를 직접 사용하는 것보다 std::make_unique와 std::make_shared를 선호하라Effective Modern C++ 2022. 8. 11. 23:44
new로 직접 할당한 객체를 사용하면 자원누수의 위험이 있다.
processWidget(std::shared_ptr<Widget>(new Widget), compute()); // 자원 누수 위험이 있음"new Widget" 실행 -> std::shared_ptr 생성자 실행과정 사이에 compute()가 실행돼 예외를 던질 수 있다. 그러면 Widget 객체 누수가 발생함.
std::make_shared<>() 을 사용하면 안전하다.processWidget(std::make_shared<Widget>(), compute()); // 자원 누수 위험이 없음또한 std::make_shared<>() 는 한 번의 할당만 함으로써 성능적 우위가 있다.
new를 사용하면 객체를 위한 메모리 할당과 제어 블럭을 위한 메모리 할당, 총 2번의 할당이 일어난다.- 하지만 new를 사용해야하는 경우도 존재한다.
- 커스텀 삭제자를 지정해야 하는 경우
- 중괄호 초기치 사용하려는 경우(이건 구지 중괄호를 안쓰면 될거같다. 또한 auto initList = { 10, 20} 이런 객체를 만들어 make 함수에 넣어주면 된다.)
------------------std::unique_ptr은 여기까지 해당----------------------1&2 - make함수로 생성하면 std::shared_ptr이 전부 파괴될지라도 std::weak_ptr이 남아있으면 객체가 차지하던 메모리는 해제되지 않는다. std::weak_ptr이 다 파괴될 때 까지.(new는 std::shared_ptr이 전부 파괴되면 객체가 차지하던 메모리 해제됨)
'Effective Modern C++' 카테고리의 다른 글
항목23. std::move와 std::forward를 숙지하라 (0) 2022.08.20 항목22. Pimpl 관용구를 사용할 때에는 특수 멤버 함수들을 구현 파일에서 정의하라 (0) 2022.08.16 항목20. std::shared_ptr처럼 작동하되 대상을 잃을 수도 있는 포인터가 필요하면 std::weak_ptr을 사용하라 (0) 2022.08.11 항목19. 소유권 공유 자원의 관리에는 std__shared_ptr를 사용하라 (0) 2022.08.05 항목18. 소유권 독점 자원 관리는 std__unique_ptr를 사용하라 (0) 2022.08.03