使用std容器的std::shared_ptr

4
我有一组shared_ptr容器,我将这些对象传递给Windows API,并在稍后通过原始指针获得回调。我想在事后定位正确的shared_ptr。是否可以使用shared_ptr实现这一点(而不使用shared_from_this())?
非常基本的例子:
class CFoo
{
};
typedef std::shared_ptr<CFoo> CFooPtr;
typedef std::set<CFooPtr> CFooSet;

extern CFooSet m_gSet;
void SomeWindowsCallBack(CFoo* pRawPtr)
{
  m_gSet.erase(pRawPtr);
}

我知道使用 intrusive_ptr 可以很容易地完成这个操作,但我想知道是否有一种使用 shared_ptr 的方法。也就是说,我希望容器可以接受 RawPtr 和 shared_ptr 来定位 shared_ptr 项。问题在于我无法将 CFoo* 隐式转换为 shared_ptr(出于我理解的原因)。

我想过可能可以这样做:

m_gSet.erase(shared_ptr<CFoo>(pRawPtr, _do_not_delete_deleter))

但我还没有尝试过,而且它看起来很危险/丑陋。还有其他方法吗?或者我基本上是在寻找 intrusive_ptr 吗?谢谢

1个回答

2
为什么不采用显而易见的方法?遍历容器,然后...
if(iterator->get() == rawPointer)
   container.erase(iterator)

编辑:要利用 O(logN) 的查找功能,您可以做您想做的事情(即,创建一个没有删除器的 shared_ptr)。这可能很丑陋,但不危险。


是的,我可以这样做,但像set和map这样的容器允许O(LogN)查找,而该方法会使我回到O(N)。我希望不要失去O(LogN)查找。 - BabelFish
你会选择使用这个选项而不是使用intrusive_ptr吗?还是你认为这种情况是使用intrusive_ptr的一个理由?(将其强制转换为shared_ptr<no_delete_deleter>会在后台执行一些分配操作) - BabelFish
幸运的是,删除器不是共享指针的模板参数!因此,不需要进行转换。 - Armen Tsirunyan
我的意思是将ptr转换为shared_ptr会导致后台分配(引用信息的分配)。对于造成的困惑,我感到抱歉。 - BabelFish

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