>백엔드 개발 >C++ >`make_shared` 대 `shared_ptr`: 하나가 더 효율적이고 예외에 안전한 이유는 무엇입니까?

`make_shared` 대 `shared_ptr`: 하나가 더 효율적이고 예외에 안전한 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-14 12:19:11496검색

`make_shared` vs. `shared_ptr`: Why is One More Efficient and Exception-Safe?

make_shared와 표준 shared_ptr의 차이점

make_shared가 왜 더 효율적인가요?

표준 shared_ptr과 비교하여 std::make_shared의 효율성을 이해하려면 , 건설 과정을 단계별로 살펴보겠습니다. 단계.

표준 shared_ptr 생성자 사용:

std::shared_ptr<Object> p2(new Object("foo"));
  • Object("foo")에 대한 힙 할당이 수행됩니다.
  • 새로운 std::shared_ptr 제어 블록은 원시를 사용하여 생성됩니다. 포인터입니다.

std::make_shared:

std::shared_ptr<Object> p1 = std::make_shared<Object>("foo");
  • std::shared_ptr 제어 블록과 객체 인스턴스 모두에 대해 단일 힙 할당을 사용하는 것은 수행했습니다.

예외 안전성

표준 shared_ptr 생성자 접근 방식에서는 Object 생성 중에 예외가 발생하면 정리가 수행되지 않아 매달린 메모리가 남습니다. 그러나 std::make_shared는 생성된 객체와 제어 블록이 단일 할당의 일부이고 예외가 발생하면 정리된다는 것을 보장합니다.

std::make_shared의 단점

  • 표준 shared_ptr 생성자를 사용하는 것과 비교하여 증가된 메모리 보존: std::make_shared는 단일 할당을 수행하므로 포인트 메모리를 해제할 수 없습니다. 제어 블록이 더 이상 사용되지 않을 때까지. 객체에 대한 약한 포인터는 제어 블록을 활성 상태로 유지하여 잠재적으로 메모리 보존 기간을 연장할 수 있습니다.

위 내용은 `make_shared` 대 `shared_ptr`: 하나가 더 효율적이고 예외에 안전한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.