2011-01-21 3 views
5

boost::weak_ptr의 경우 operator<이 정의되어 연관 컨테이너에 사용할 수 있습니다.만료 후 boost :: weak_ptr의 정렬 순서는 무엇입니까?

제 질문은 : weak_ptr 개체 중 일부가 0의 참조로 변경되는 경우에도 안정적인 정렬 순서입니까? std::set과 같은 컨테이너로 엉망이되지 않습니까?

예 :

using namespace boost; 
shared_ptr<A> sptrA1(new A); 
weak_ptr<A> wptrA1 = sptrA1; 
weak_ptr<A> wptrA2; 

{ // begin Scope 1 
    shared_ptr<A> sptrA2(new A); 
    wptrA2 = sptrA2; 
    assert(wptrA1 < wptrA2); // assert #1 
} 
assert(wptrA1 < wptrA2); // assert #2 
  • 항상 어설 션 # 1에 해당하는 경우 성립 # 2를 주장 할 것인가?
  • wptrA2은 범위 1 이전과 이후의 동일한 상태에 있습니까?

답변

5

boost::weak_ptr의 현재 구현에서 operator<은 내부 참조 카운트 추적 구조에 대한 포인터를 비교합니다. 이 구조는 모든 강력한 및 약한 참조가 제거 될 때까지 해제되지 않으므로 강한 참조가 없어 지적한 사용자 데이터가 해제 된 경우에도 operator<을 사용하는 것이 안전합니다.

+0

흥미 롭습니다. 나는 http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/weak_ptr.htm에있는 use_count의 문서에 혼란 스러웠다. 그것은 "반환 값 : * 이것이 비어있는 경우 0입니다."그러나 대답에 따르면 역 (*가 0을 반환하면 비어 있음)이 사실이 아니라고하지? (empty가 weak_ptr을 구성하는 기본 값에서 얻은 상태로 정의 된 경우) –

+0

여기서'use_count'가 수행하는 작업에 대해 언급하지 않았습니다. :) 즉, 내부 참조 계산 구조는 강력한 참조 용으로 만 두 개를 유지합니다 (그것이 0이 될 때, 지적 된 객체는 파괴된다), 강한 참조와 약한 참조를 모두 포함한다. (그것이 0 일 때 참조 계산 구조는 파괴된다.) 'use_count' 함수는 strong-count-only 함수를보고 있을지도 모릅니다. 그러나 나는 전혀 조사하지 않았으므로 직접 확인하십시오. :) – bdonlan

2

weak_ptr comparision here에 대해 알아보기.

+0

흥미로운 읽기. 별로 사소한 문제는 아닙니다. –

1

std :: owner_less를 사용하십시오. 이것은 포인터 자체가 아니라 사용 횟수의 포인터를 비교합니다. 예 :

typedef std::weak_ptr<int> IntWPtr; 
std::set<IntWPtr, std::owner_less<IntWPtr> > m_set; 
+0

흥미 롭군요. 그러나 이것은 현재 사용할 수없는 C++ 11 기능입니다. –

관련 문제