문제

나는 내 코드에서 boost :: scoped_ptr을 많이 사용하고 있으며 훌륭하지만 현재 Shared_ptr을 모든 곳에서 사용하는 소프트웨어로 작업하고 있으며 뭔가 빠진지 궁금합니다.

AFAIK A Shared_ptr은 다른 스레드가 동일한 데이터에 액세스 할 예정이며 스레드가 완료 될 순서를 알지 못하는 경우에만 유용합니다 (Shared_ptr은 마지막 스레드가 완료 될 때까지 객체가 존재하는지 확인합니다).

다른 사용 사례가 있습니까?

도움이 되었습니까?

해결책

여기서 실은 여기에 관련이 없습니다. 관련된 것은 객체가 더 이상 사용되지 않는 지점을 쉽게 지정하는지 여부입니다.

여러 다른 객체가 동일한 객체를 사용하려고한다고 가정합니다. 데이터 팩, 입력/출력, 또는 일부 기하학적 객체 등 일 수 있습니다. 이전의 모든 사용 객체가 삭제 된 후 공유 객체를 삭제하기를 원하며, 이전에는 클록 사이클이 아닌 클록주기가 아닙니다. 어떤 소유물이 가장 긴 수명을 할 것인지 알아 내지 않고 (프로그램을 변경하거나 사용자 상호 작용을 통해 변경 될 수 있음) Shared_PTR을 사용 하여이 동작을 강요 할 수 있습니다.

사용 객체가 동일하거나 다른 스레드에 있는지 여부는 중요하지 않습니다. 물체는 모두 같은 스레드에 있더라도 예측할 수없는 수명을 가질 수 있습니다.

다른 팁

afaik a shared_ptr은 다른 스레드가 동일한 데이터에 액세스하는 경우에만 유용합니다.

글쎄, 그것은 여러 곳의 상황을위한 것입니다 소유자 스마트 포인터가 가리키는 동일한 객체를 소유하고 있습니다. 그들은 다른 스레드의 스마트 포인터에 액세스 할 수 있으며 shared_ptr 그 지역에서도 사용할 수 있지만 그것은 요점이 아닙니다. 마지막 소유자가 지적 된 개체에 대한 참조를 잃으면 shared_ptr 메커니즘은 객체를 삭제합니다.

당신은 a를 사용할 수 있습니다 scoped_ptr 당신이 갖고 싶은 것이 생성 된 범위가 왼쪽으로 삭제 될 때 삭제되는 포인터라면 (예외에 따라, 이동 외부 또는 정상 제어 흐름 또는 다른 메커니즘에 의해). 그렇게 사용하면 shared_ptr로 변경할 필요가 없습니다.

scoped_ptr과 shared_ptr (및 auto_ptr)의 차이점은 주로 사본 의미입니다.

  • scoped_ptr은 "리소스 할당은 초기화입니다"복사 할 수 없습니다 (다른 사례와 공유 할 수 없으며 소유권을 양도 할 수 없습니다).
  • Shared_ptr은 여러 당사자간에 공유 될 때 메모리의 자동 교정을위한 것
  • auto_ptr는 복사 가능합니다 (그리고 할당 된 경우 소유권을 전송)

shared_ptr과 scoped_ptr의 또 다른 중요한 차이점은 shared_ptr 만 약한 _ptr과 함께 작동한다는 것입니다. 약한 포인터는 공유 포인터의 사이클을 파괴하는 데 사용되므로 메모리 누출을 피하기 만하면 약점이 그 이상으로 사용될 수 있습니다.

공유 및 약한 포인터는 소유와 소유하지 않은 참조의 차이를 표현하는 데 사용될 수 있습니다. 데이터의 명백한 소유권은 더 깨끗한 설계로 이어지므로 가능한 경우 데이터 객체를 소유해야합니다. 하나 shared_ptr를 통한 다른 객체. 데이터 객체에 대한 다른 장기적인 참조는 데이터의 비 소유권을 표현하는 약한 포인터 여야합니다. 소유하지 않는 모듈이 데이터에 액세스 할 때마다 약점 _ptr을 shared_ptr로 변환해야하며,이 시점에서 데이터 객체가 더 이상 존재하지 않을 수 있습니다. 그러나 비 소유 모듈은 데이터 객체에 액세스하지만 Transient Shared_PTR을 통해 데이터 객체를 보유하여 소유 객체가 데이터를 해제하더라도 안전한 작동을 보장합니다.

이미 대답했듯이 Shared_ptr은 공유 소유권에 관한 것입니다. 그러나 나는 공유 소유권이 일반적으로 나쁜 일이라고 주장하며 (플라이급 패턴과 같은 예외는 존재 함) 소유자를 식별하고 scoped_ptr을 거기에 두는 것이 좋습니다.

shared_ptr은 참조 계산을하는 스마트 포인터 유형입니다. 객체 (빈번한 경우)에 대한 소유자가 하나만 있으면 scoped_ptr이 올바른 솔루션입니다. 코드의 여러 부분에서 객체를 공유 할 수 있다면 Shared_ptr은 모든 참조가 해제 될 때까지 객체를 파괴하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top