boost::weak_ptr在过期后的排序顺序是什么?

5

对于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 前后是否处于相同状态?
3个回答

5

在当前的boost::weak_ptr实现中,operator<比较一个指针和一个内部的引用计数跟踪结构。这个结构直到所有强引用和弱引用都被删除才会被释放,因此即使指向的用户数据由于缺乏强引用而被释放,使用operator<仍然是安全的。


有趣。我被http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/weak_ptr.htm中use_count的文档困惑了。它声明“返回:0如果*this为空”,但是根据你的回答,反之(*this为空,如果返回0)就不成立了,对吗?(如果将空定义为从默认构造一个weak_ptr获得的状态。) - Hanno S.
我没有关于 use_count 在这里的作用做任何声明 :) 话虽如此,内部引用计数结构保持两个计数 - 仅针对强引用的计数(当它归零时,指向对象被销毁),以及同时包含强引用和弱引用的计数(当它归零时,引用计数结构被销毁)。use_count 函数可能正在查看仅限于强引用的计数,但我没有进行过任何调查,所以请自行验证。 :) - bdonlan

2

在这里阅读有关weak_ptr比较的内容


1
使用std::owner_less。这将比较使用计数的指针,而不是指针本身。例如:
typedef std::weak_ptr<int> IntWPtr;
std::set<IntWPtr, std::owner_less<IntWPtr> > m_set;

有趣,然而这是一个C++11的特性,我目前无法使用。 - Hanno S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接