对于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
wptrA2
处于相同的状态吗?答案 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;