programing tip

new operator [duplicate]보다 std :: make_unique 사용의 장점

itbloger 2020. 9. 8. 07:44
반응형

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/ deletenew[]/ 말하지 마십시오"를 가르칩니다 delete[].

  • make_unique두 가지 장점을 공유 make_shared합니다 (세 번째 장점 제외, 효율성 증가). 먼저 두 번 언급해야하고 한 번 언급 unique_ptr<LongTypeName> up(new LongTypeName(args))해야합니다 .LongTypeNameauto up = make_unique<LongTypeName>(args)

  • make_uniquefoo(unique_ptr<X>(new X), 같은 식에 의해 트리거되는 지정되지 않은 평가 순서 누출을 방지합니다 unique_ptr<Y>(new Y)). (조언 "말하지 않을 이어 new"보다 간단 "결코 말할 new즉시라는 이름으로 제공하지 않는 한, unique_ptr".)

  • make_unique예외 안전을 위해 신중하게 구현되며 unique_ptr생성자 를 직접 호출하는 것보다 권장됩니다 .

사용하지 않을 때 make_unique

  • make_unique사용자 지정 삭제자가 필요하거나 다른 곳에서 원시 포인터를 채택하는 경우 사용하지 마십시오 .

출처

  1. 의 제안std::make_unique .
  2. Herb Sutter의 GotW # 89 솔루션 : 스마트 포인터

차이점은입니다 std::make_unique반환 형식의 개체 std::unique_ptrnew생성 된 개체에 대한 포인터를 반환합니다. 메모리 할당 실패의 경우 둘 다 발생합니다. 잠깐만 요, 그렇게 간단하지 않습니다. 더 읽어보세요.

아래에서 이러한 기능을 고려하십시오.

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

반응형