对于boost::weak_ptr,已定义operator<,以便可以在关联容器中使用。

我的问题是:即使某些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是否处于相同状态?
  • 最佳答案

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

    09-09 18:34