【问题标题】:sort order of boost::weak_ptr after expiring?到期后 boost::weak_ptr 的排序顺序?
【发布时间】:2011-06-13 07:49:48
【问题描述】:

对于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 是否始终为真?
  • wptrA2在Scope 1前后的状态是否相同?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 有趣。我对boost.org/doc/libs/1_43_0/libs/smart_ptr/weak_ptr.htm 中的 use_count 文档感到困惑。它声明“如果 *this 为空,则返回:0”但是根据您的回答,相反的(*this 为空,如果它返回 0)不正确,对吗? (如果为空则定义为从默认构造weak_ptr获得的状态。)
    • 我还没有就use_count 在这里所做的事情发表任何声明 :) 也就是说,内部引用计数结构保留了两个计数 - 一个仅用于强引用(当它达到零时,指出 - to-object 被销毁)和一个包含强引用和弱引用的对象(当它达到零时,引用计数结构被破坏)。 use_count 函数可能正在查看仅强计数的函数,但我根本没有调查过,因此请自行验证。 :)
    【解决方案2】:

    阅读weak_ptr比较here

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 很有趣,但这是我目前无法使用的 C++11 功能。
      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      • 2020-02-15
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      相关资源
      最近更新 更多