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()); }
}
虽然我不能shared_from_this()
在 dtor 中使用,但这似乎是一个有效的用例,因为A::remove()
我不关心存储的指针的内存,只关心我假设std::owner_less
和std::owner_before
工作的引用计数块位置。
我可以想到替代方案:
(a) 使用延迟清除(例如,稍后迭代时,A::m_coll
如果您发现通过锁定获得的 shared_ptr 为 null/false,则从集合中删除 weak_ptr)。
(b) 在B
自身中存储一个weak_ptr {当然是通过shared_from_this() 获得的} 并将其传递给A::remove(..)
dtor of B
。
但是是否有任何解决方案可以通过已知的习语实现(例如,如果标准要求将weak_ptr存储在其中,std::enable_shared_from_this
那么我可以在 dtor 中访问它B
并完成工作)?
{顺便说一句,我不能使用上面的 (a),因为我需要在B
inA::m_coll
被破坏时立即触发很多事情。}