5

Forboost::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 是否总是成立?
  • wptrA2Scope 1 前后是否处于相同状态?
4

3 回答 3

5

在当前的实现中boost::weak_ptroperator<比较一个指向内部引用计数跟踪结构的指针。在删除所有强引用和弱引用之前,不会释放此结构,因此operator<即使指向的用户数据由于缺少强引用而被释放,它仍然可以安全使用。

于 2011-01-21T18:06:34.370 回答
2

在此处阅读有关weak_ptr 比较的信息。

于 2011-01-21T18:08:15.977 回答
1

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

typedef std::weak_ptr<int> IntWPtr;
std::set<IntWPtr, std::owner_less<IntWPtr> > m_set;
于 2011-05-19T23:19:58.480 回答