새로운 std :: make_unique와 std :: unique_ptr의 차이점 이점이 std::make_shared있습니까? 수동 구성 std::unique_ptr과 비교하여

않습니다 std::make_unique 와 같은 효율성 이점이 std::make_shared있습니까?

수동 구성 std::unique_ptr과 비교하여 :

std::make_unique<int>(1);         // vs
std::unique_ptr<int>(new int(1));


답변

뒤에 동기 make_unique는 주로 두 가지입니다.

  • make_unique명시 적으로 사용 new하면 명명되지 않은 임시를 사용하지 않는 규칙을 기억해야합니다.

    foo(make_unique<T>(), make_unique<U>()); // exception safe
    
    foo(unique_ptr<T>(new T()), unique_ptr<U>(new U())); // unsafe*
  • make_unique마지막으로 ‘를 추가 하면’을 제외하고 new는 ‘사용하지 마십시오’라는 이전 규칙이 아닌 ‘사용 하지 않음’을 사람들에게 알릴 수 있습니다 .newunique_ptr

세 번째 이유도 있습니다.

  • make_unique중복 유형 사용이 필요하지 않습니다. unique_ptr<T>(new T())->make_unique<T>()

그 이유 중 어느 것도 사용 make_shared하지 않는 방식으로 런타임 효율성을 개선하는 것과 관련 이 없습니다 (잠재적 인 최대 메모리 사용 비용으로 두 번째 할당을 피하기 때문에).

* C ++ 17에는 더 이상 안전하지 않은 규칙 변경이 포함될 것으로 예상됩니다. C ++위원회 보고서 P0400R0P0145R3을 참조하십시오 .


답변

std::make_unique그리고 std::make_shared두 가지 이유가 있습니다 :

  1. 따라서 템플릿 유형 인수를 명시 적으로 나열 할 필요가 없습니다.
  2. 사용 std::unique_ptr또는 std::shared_ptr생성자에 대한 추가 예외 안전 . ( 여기 노트 섹션을 참조 하십시오 .)

실제로 런타임 효율성에 관한 것이 아닙니다. 제어 블록과 T할당 에 대한 내용이 한꺼번에 있지만, 이러한 기능이 존재하는 동기는 더 적고 동기 부여가 적습니다.


답변

대신 std::unique_ptr(new A())또는 std::shared_ptr(new A())직접 대신 사용해야하는 이유 는 현재 범위를 벗어난 std::make_*()클래스의 생성자에 액세스 할 수 없기 때문 A입니다.


답변

함수 호출 고려

void function(std::unique_ptr<A>(new A()), std::unique_ptr<B>(new B())) { ... }

new A()는 성공하지만 new B()는 예외를 던진다 고 가정 하십시오. 프로그램의 정상적인 실행을 재개하기 위해 잡습니다. 불행히도 C ++ 표준은 객체 A가 파괴되고 메모리 할당이 해제 될 것을 요구하지 않습니다. A와 B를 포장 std::make_uniques하면 누출이 발생하지 않습니다.

void function(std::make_unique<A>(), std::make_unique<B>()) { ... }

여기서 포인트는 것입니다 std::make_unique<A>std::make_unique<B>소멸자이 발생됩니다 메모리가 해제 : 이제 임시 개체이며, 임시 개체의 정리가 제대로 C에 지정된 ++ 표준. 따라서 가능하면 항상 std::make_uniqueand를 사용하여 객체를 할당하는 것을 선호하십시오 std::make_shared.