문제

에 현재 프로젝트 사용 boost::shared_ptr 매우 광범위하게.

최근 동료 팀원도 사용하기 시작 weak_ptr.내가 알지 못하는 한 사용하면 됩니다.

이 외에도에서,나는 무엇을 해야 하는 경우로 변환하고 싶 weak_ptr 하기 shared_ptr.가기 weak_ptr 을 만들기 shared_ptr 에 영향을 주 내에서 코드를 다른 스레드가?

도움이 되었습니까?

해결책

일반적으로 요약,

강한 포인터 자신의 타당성을 보장합니다. 예를 들어 다음과 같이 사용하십시오.

  • 당신은 가리키는 대상을 소유하고 있습니다. 당신은 그것을 만들어 파괴합니다
  • 객체가 존재하지 않는 경우 동작이 정의되지 않았습니다.
  • 객체가 존재하는 것을 시행해야합니다.

약한 포인터 보장하다 그들 자신의 타당성. 예를 들어 다음과 같이 사용하십시오.

  • 당신은 그것을 액세스하지만 그것은 당신의 것이 아닙니다.
  • 객체가 존재하지 않으면 동작을 정의했습니다

약한 포인터의 잠금 ()은 강력한 포인터를 반환합니다. 이것이 약한 포인터에 액세스하는 방법입니다. 객체가 더 이상 유효하지 않으면 (삭제 된 등) 강한 포인터가 널이면 객체를 가리 킵니다. 이것을 확인해야합니다.

일시적으로 (로컬) 강한 포인터를 만들었 기 때문에 사용하는 동안 실수로 객체를 삭제할 수 없도록 이런 방식으로 설정되어있어 강한 포인터가 남아있는 동안 물체의 존재를 가열했습니다. 객체를 사용하여 완료되면 일반적으로 강한 포인터가 범위를 벗어나거나 재 할당하여 객체를 삭제할 수 있습니다. 멀티 스레딩의 경우, 동일한 치료로 처리하여 스레드 안전이 내장되지 않은 다른 것들을 취급합니다. ~ 할 것이다 멀티 스레딩을 할 때 유지하십시오. Afaik 그들은 과거에 특별한 일을하지 않습니다.

부스트 공유 포인터에는 또한 물체에 대한 마지막 강한 포인터가 사라지거나 다른 곳으로 가리킬 때 객체가 삭제되기 때문에 기능과 같은 쓰레기 수집가가 있습니다.

다른 답변에 언급 된 성능과 원형 종속성도 있습니다.

기본적으로, 부스트 공유 포인터 라이브러리를 사용하면 프로그램을 만들지 못하게 할 수 있지만, 포인터, 객체 소유자 자신의 수명 및 수명을 올바르게 설계하는 데 시간을 할애 할 수는 없습니다. 그러한 디자인이있는 경우 라이브러리를 사용하여 시행 할 수 있습니다. 그러한 디자인이 없다면 이전과 다른 문제가 발생할 수 있습니다.

다른 팁

weak_ptr 때 만드는 개체를 포함한 순환을 참조,즉 shared_ptr 하는 개체 shared_ptr 다시합니다.이 때문입니다 shared_ptr 을 처리할 수 없는 순환을 참조할 때 두 개체 범위를 벗어,상호 참조는 그들은하지 않습니다"쓰레기 수집",그래서 메모리가 손실되고 있는 메모리 누수가 발생합니다.이 weak_ptr 을 증가시키지 않는 참조 횟수,순환을 참조 문제가 발생하지 않습니다.이것은 또한 의미에서 일반적으로 하려는 경우 포인터를 가지는 것은 참조를 계산하고 싶지 않을 증가 참조 계산,다음 사용 weak_ptr.

그렇지 않으면 사용할 수 있습니다 shared_ptr.

자세한 내용을 확인 향상 문서.

공유 포인터 구현 참조 계산, 약한 포인터는 기준 계수에 영향을 미치지 않으며, 객체에 대한 포인터를 공유하지 않으면 약한 포인터 만 객체가 삭제되고 약한 포인터는 이제 물체가 손실되었다고 말합니다.

약한 포인터를 사용해야하는 두 가지 이유가 있습니다.

  1. 참조 계수 비용을 제거하기 위해 증가 / 감소; 그러나 오류가 발생하고 실제로 많은 시간을 절약하지 않기 때문에이 작업을 수행해서는 안됩니다.
  2. 부기 데이터 구조에서 예를 들어, "살아있는"모든 객체 foo의 색인이 있으며, 즉 다른 곳에서 사용되었으며, 모든 "실제"용도가 종료 된 경우 인덱스에 Foo를 생생하게 유지하고 싶지 않습니다. 이것은 약한 포인터의 기본 현실적인 사용 사례입니다. 물론 다른 사람들도 존재합니다.

따라서 일반적으로, 내 권장 사항은 참조 된 객체를 삭제하고이를 감지하려는 것을 알고있을 때만 약한 포인터를 사용하는 것입니다. 다른 경우에는 공유 포인터 (참조 계산) 또는 직접 포인터, esp를 사용합니다. 메소드에서 객체가 삭제되지 않을 것임을 알 때 로컬 변수. 그러나 오류가 발생하지만 공유 포인터보다 빠릅니다.

NB주기 객체에는 약한 포인터가 필요하지 않으며 가장 적절하게 구성된 프로그램에서 조리되지 않은 일반 포인터를 사용할 수 있습니다. 그러나 약한 포인터는 덜 위험합니다.

쓰레기 수집기를 구현하려고하지 않는 한 약한 포인터를 전혀 사용하지 말아야 할 것입니다. 이는 C ++의 뜨거운 아이디어가 아닙니다. 충분히 잘못 될 수있는 모든 것을 추적하기가 너무 어렵 기 때문입니다.

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