c – 带有std容器的std :: shared_ptr

我有一个shared_ptrs容器,我把这些对象移到了一个
Windows API上,后来我用raw ptr得到一个回调函数.我想在事后找到合适的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. Aka我正在寻找接受RawPtr的容器和用于定位shared_ptr项的shared_ptr.问题是我无法隐式地将CFoo *强制转换为shared_ptr(出于我理解的原因).

我以为我能做到

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

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

最佳答案 为什么不明显的方式?通过容器迭代,并且

if(iterator->get() == rawPointer)
   container.erase(iterator)

编辑:要利用O(logN)查找,您可以执行您想要的操作(即,使用no_op删除器创建shared_ptr).它可能很难看,但并不危险

点赞