4
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_lessstd::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),因为我需要在BinA::m_coll被破坏时立即触发很多事情。}

4

0 回答 0