new operator [duplicate]보다 std :: make_unique 사용의 장점
이 질문에 이미 답변이 있습니다.
초기화 std::make_unique
를 위해 new
연산자를 사용하는 것의 장점은 무엇입니까 std::unique_ptr
?
즉, 왜
std::unique_ptr<SomeObject> a = std::make_unique(SomeObject(...))
하는 것보다 낫다
std::unique_ptr<SomeObject> a = new SomeObject(...)
나는 온라인에서 많은 것을 찾아 보았고 new
현대 C ++에서 연산자를 피하는 것이 좋은 경험 법칙이라는 것을 알고 있지만이 정확한 시나리오에서 어떤 이점이 있는지 확신 할 수 없습니다. 발생할 수있는 메모리 누수를 방지합니까? std::make_unique
사용 하는 것보다 하는 것이 더 빠릅 new
니까?
장점
make_unique
사용자에게 면책 조항없이 "절대new
/delete
및new[]
/ 말하지 마십시오"를 가르칩니다delete[]
.make_unique
두 가지 장점을 공유make_shared
합니다 (세 번째 장점 제외, 효율성 증가). 먼저 두 번 언급해야하고 한 번 언급unique_ptr<LongTypeName> up(new LongTypeName(args))
해야합니다 .LongTypeName
auto up = make_unique<LongTypeName>(args)
make_unique
foo(unique_ptr<X>(new X)
, 같은 식에 의해 트리거되는 지정되지 않은 평가 순서 누출을 방지합니다unique_ptr<Y>(new Y))
. (조언 "말하지 않을 이어new
"보다 간단 "결코 말할new
즉시라는 이름으로 제공하지 않는 한,unique_ptr
".)make_unique
예외 안전을 위해 신중하게 구현되며unique_ptr
생성자 를 직접 호출하는 것보다 권장됩니다 .
사용하지 않을 때 make_unique
make_unique
사용자 지정 삭제자가 필요하거나 다른 곳에서 원시 포인터를 채택하는 경우 사용하지 마십시오 .
출처
차이점은입니다 std::make_unique
반환 형식의 개체 std::unique_ptr
및 new
생성 된 개체에 대한 포인터를 반환합니다. 메모리 할당 실패의 경우 둘 다 발생합니다. 잠깐만 요, 그렇게 간단하지 않습니다. 더 읽어보세요.
아래에서 이러한 기능을 고려하십시오.
void func(ClassA* a, ClassB* b){
......
}
다음과 같이 전화를 걸 때 func(new A(), new B())
; 컴파일러는 함수 인수를 왼쪽에서 오른쪽으로 또는 원하는 순서대로 평가하도록 선택할 수 있습니다. 왼쪽에서 오른쪽으로 평가한다고 가정 해 보겠습니다. 첫 번째 new
표현식이 성공했지만 두 번째 new
표현식이 던지면 어떻게됩니까?
The real danger here is when you catch such exception; Yes, you may have caught the exception thrown by new B()
, and resume normal execution, but new A()
already succeeded, and its memory will be silently leaked. Nobody to clean it up... * sobs...
But with make_unique
, you cannot have a leak because, stack unwinding will happen ( and the destructor of the previously created object will run). Hence, having a preference for make_unique
will constrain you towards exception safety. In this case, std::make_unique
provides a "Basic Exception Safety" that the memory allocated and object created by new
will never be orphaned no matter what. Even till the ends of time... :-)
You should read Herb Sutter GoTW102
참고URL : https://stackoverflow.com/questions/37514509/advantages-of-using-stdmake-unique-over-new-operator
'programing tip' 카테고리의 다른 글
IntelliJ IDEA는 Spring의 @Autowired 주석을 사용할 때 오류를 표시합니다. (0) | 2020.09.08 |
---|---|
JWT 토큰의 최대 크기는 얼마입니까? (0) | 2020.09.08 |
프레임 워크에서 프레임 워크 없음으로 전환 (0) | 2020.09.08 |
"바이트 수"를 0으로 설정하여 memcpy () 및 memmove ()를 호출 할 수 있습니까? (0) | 2020.09.08 |
여러 CSS / JS 파일 결합 및 축소 (0) | 2020.09.08 |