않습니다 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
는 ‘사용하지 마십시오’라는 이전 규칙이 아닌 ‘사용 하지 않음’을 사람들에게 알릴 수 있습니다 .new
unique_ptr
세 번째 이유도 있습니다.
make_unique
중복 유형 사용이 필요하지 않습니다.unique_ptr<T>(new T())
->make_unique<T>()
그 이유 중 어느 것도 사용 make_shared
하지 않는 방식으로 런타임 효율성을 개선하는 것과 관련 이 없습니다 (잠재적 인 최대 메모리 사용 비용으로 두 번째 할당을 피하기 때문에).
* C ++ 17에는 더 이상 안전하지 않은 규칙 변경이 포함될 것으로 예상됩니다. C ++위원회 보고서 P0400R0 및 P0145R3을 참조하십시오 .
답변
std::make_unique
그리고 std::make_shared
두 가지 이유가 있습니다 :
- 따라서 템플릿 유형 인수를 명시 적으로 나열 할 필요가 없습니다.
- 사용
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_unique
and를 사용하여 객체를 할당하는 것을 선호하십시오 std::make_shared
.