我有一个容器 shared_ptr
s 和我将这些对象交给 Windows API,稍后我使用原始 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
.也就是我正在寻找容器来接受 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)。它可能很难看,但并不危险
关于c++ - 带有标准容器的 std::shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5236232/