到期后boost :: weak_ptr的排序顺序?

时间:2011-01-21 17:59:45

标签: c++ boost boost-smart-ptr

对于boost::weak_ptroperator<已定义,因此可以在关联容器中使用。

我的问题是:几个weak_ptr个对象的排序顺序是否稳定,即使其中一些对象更改为零引用?不会像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是否总是成立?
  • 范围1之前和之后wptrA2处于相同的状态吗?

3 个答案:

答案 0 :(得分:5)

boost::weak_ptr的当前实现中,operator<将指针与内部引用计数跟踪结构进行比较。在删除所有强和弱引用之前,不会释放此结构,因此即使由于缺少强引用而已释放指向的用户数据,使用operator<仍然是安全的

答案 1 :(得分:2)

阅读weak_ptr比较{{3p>

答案 2 :(得分:1)

使用std :: owner_less。这比较了使用计数的指针,而不是指针本身。例如:

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