class A
{
std::set<std::weak_ptr<B>, std::owner_less<std::weak_ptr<B>>> m_coll;
public:
remove(const std::weak_ptr<B> &refWptrB);
}
class B : public std::enable_shared_from_this<B>
{
~B() { sharedPtrOfA->remove(shared_from_this()); }
}
虽然我不能在dtor中使用shared_from_this()
,但这似乎是一个有效的用例,如A::remove()
我不关心存储指针的内存,只关注引用计数块位置我认为std::owner_less
和std::owner_before
工作。
我可以考虑其他选择:
(a)使用延迟清除(例如,如果您发现通过锁定获得的shared_ptr为null / false,则稍后迭代A::m_coll
,然后从集合中删除weak_ptr)。
(b)将weak_ptr存储在B
本身{通过shared_from_this()}获取,并将其传递给A::remove(..)
中的B
。
但是有没有通过已知的习惯用法实现的解决方案(例如,如果标准要求将weak_ptr存储在std::enable_shared_from_this
中,那么我可以在B
的dtor中访问它并完成工作)?
{顺便说一下我不能用上面的(a)因为我需要在B
中的A::m_coll
被销毁时立即触发很多事情。}