shared_ptr 예제

shared_ptr 예제

2 agosto, 2019

예를 들어 10개의 정수 배열을 할당하려면 요소를 복사하는 알고리즘을 사용하는 경우 shared_ptr로 코드를 작성할 수 있습니다. shared_ptr에서 요소를 래핑한 다음 기본 메모리가 필요한 만큼 유효하고 더 이상 유효하지 않다는 것을 이해하여 다른 컨테이너에 복사할 수 있습니다. 다음 예제에서는 벡터의 shared_ptr 인스턴스에서 replace_copy_if 알고리즘을 사용하는 방법을 보여 주며 있습니다. 동일한 개체를 공유하는 여러 스마트 포인터를 만들려면 첫 번째 공유 포인터를 별칭으로 하는 다른 shared_ptr을 만들어야 합니다. 원시 포인터 오버로드는 가리키는 개체의 소유권을 가정합니다. 따라서 shared_ptr(ptr.get())와 같이 shared_ptr에서 이미 관리되는 개체에 대해 원시 포인터 오버로드를 사용하여 shared_ptr을 생성하면 개체가 std::enable_shared_에서 파생된 형식인 경우에도 정의되지 않은 동작으로 이어질 수 있습니다. _이. 모든 멤버 함수(복사 생성자 및 복사 할당 포함)는 이러한 인스턴스가 동일한 개체의 복사본및 공유 소유권인 경우에도 추가 동기화 없이 shared_ptr의 다른 인스턴스에서 여러 스레드에서 호출할 수 있습니다. 여러 실행 스레드가 동기화없이 동일한 shared_ptr에 액세스하고 이러한 액세스가 shared_ptr의 비 const 멤버 함수를 사용하는 경우 데이터 경합이 발생합니다. 원자 함수의 shared_ptr 오버로드를 사용하여 데이터 경합을 방지할 수 있습니다. shared_ptr에 의해 직접 보유 된 포인터는 get()에 의해 반환 되는 포인터이며, 컨트롤 블록에 의해 보유 된 포인터 /개체는 공유 소유자 수가 0에 도달하면 삭제됩니다.

이러한 포인터가 반드시 같지는 않습니다. 가능하면 make_shared 함수를 사용하여 메모리 리소스를 처음 만들 때 shared_ptr을 만듭니다. make_shared는 예외로 안전합니다. 동일한 호출을 사용하여 컨트롤 블록과 리소스에 대한 메모리를 할당하므로 구성 오버헤드가 줄어듭니다. make_shared를 사용하지 않는 경우 shared_ptr 생성자에게 전달하기 전에 명시적 새 식을 사용하여 개체를 만들어야 합니다. 다음 예제에서는 새 개체와 함께 shared_ptr을 선언하고 초기화하는 다양한 방법을 보여 주며 있습니다. 순환 종속성 (shared_ptr 문제): 두 클래스 A와 B가 있는 시나리오를 고려해 보겠습니다. 따라서 A가 B를 가리키는 것과 같으며 B가 A를 가리키므로 use_count는 0에 도달하지 않으며 삭제되지 않습니다. dynamic_pointer_cast, static_pointer_cast 및 const_pointer_cast를 사용하여 shared_ptr을 캐스팅할 수 있습니다.

이러한 함수는 dynamic_cast, static_cast 및 const_cast 연산자와 유사합니다. 다음 예제에서는 기본 클래스의 shared_ptr 벡터에서 각 요소의 파생 된 형식을 테스트 한 다음 요소를 복사 하 고 그들에 대 한 정보를 표시 하는 방법을 보여 주었습니다. 다양한 소스 (여기 와 여기)에 따르면 스마트 포인터의 성능은 원시 포인터에 가까워야합니다. 내부 참조 계산으로 인해 std::shared_ptr에 약간의 속도 페널티가 있을 수 있습니다. 모두 모두, 몇 가지 오버 헤드가 있다, 하지만 그것은 하지 않아야 코드 는 지속적으로 만들고 스마트 포인터를 파괴 하지 않는 한. 다음 예제에서는 다른 shared_ptr에서 이미 할당된 개체의 공유 소유권을 사용하는 shared_ptr 인스턴스를 선언하고 초기화하는 방법을 보여 주며, 이 예제에서는 shared_ptr 인스턴스를 선언하고 초기화하는 방법을 보여 주며, 이 인스턴스는 다른 shared_ptr에서 이미 할당된 개체의 공유 소유권을 가지고 있습니다. sp2가 초기화 된 shared_ptr이라고 가정합니다. shared_ptr은 일반 포인터 역할을 합니다.

std::unique_ptr이 보유하고있는 동적 객체를 매우 질투한다고 말할 수 있습니다 : 동적 데이터에 대한 여러 참조를 가질 수 없습니다.