> 백엔드 개발 > C++ > 본문

`std::shared_ptr`은 유형 삭제에도 불구하고 객체 파괴 동작을 어떻게 보존합니까?

Mary-Kate Olsen
풀어 주다: 2024-10-31 17:40:01
원래의
592명이 탐색했습니다.

How Does `std::shared_ptr` Preserve Object Destruction Behavior Despite Type Erasure?

std::shared_ptr 밝혀진 기능

이 질문은 std::shared_ptr의 수수께끼 같은 기능을 중심으로 진행됩니다. 처음에는 믿기지 않는 것으로 일축했지만 다음 코드 조각에서 관찰된 동작은 회의론을 불러일으켰습니다.

<code class="cpp">#include <memory>
#include <iostream>
#include <vector>

int main() {
  std::cout << "At begin of main.\ncreating std::vector<std::shared_ptr<void>>" << std::endl;
  std::vector<std::shared_ptr<void>> v;
  {
    std::cout << "Creating test" << std::endl;
    v.push_back(std::shared_ptr<test>(new test()));
    std::cout << "Leaving scope" << std::endl;
  }
  std::cout << "Leaving main" << std::endl;
  return 0;
}</code>
로그인 후 복사

코드는 다음과 같은 결과를 보여줍니다.

At begin of main.
creating std::vector<std::shared_ptr<void>>
Creating test
Test created
Leaving scope
Leaving main
Test destroyed
로그인 후 복사

유형 삭제 이해

이 동작의 핵심은 std::shared_ptr이 수행하는 유형 삭제에 있습니다. 새 인스턴스를 초기화할 때 std::shared_ptr은 내부 삭제 기능을 저장합니다. 이 함수는 기본적으로 shared_ptr이 삭제될 때 삭제 연산자를 호출합니다. 이 메커니즘은 shared_ptr의 유형에 관계없이 가리키는 개체의 소멸자가 적절한 시간에 호출되도록 보장합니다.

캐스팅 결과

std 캐스팅 ::shared_ptr std::shared_ptr 원래 테스트 소멸자를 여전히 참조하는 저장된 삭제자 함수를 변경하지 않습니다. 따라서, shared_ptr 소멸되어도 올바른 소멸자가 계속 호출되어 예상한 동작이 발생합니다.

표준 준수 및 향후 영향

이 기술의 보장된 동작과 관련하여 다음이 중요합니다. std::shared_ptr의 내부 구현은 컴파일러와 플랫폼에 따라 다를 수 있습니다. 유형 삭제는 shared_ptrs의 기본 측면이었지만 구현에 대한 향후 변경 사항은 잠재적으로 설명된 기능에 영향을 미칠 수 있습니다.

따라서 이 동작에만 의존하는 것은 권장되지 않으며 프로덕션 코드에서는 피해야 합니다. 대신 std::function 또는 사용자 정의 삭제자 클래스를 사용하는 등의 대체 접근 방식이 더욱 강력하며 다양한 구현에서 일관된 동작을 제공합니다.

위 내용은 `std::shared_ptr`은 유형 삭제에도 불구하고 객체 파괴 동작을 어떻게 보존합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!