【问题标题】:std::shared_ptr with std containers带有 std 容器的 std::shared_ptr
【发布时间】:2011-03-08 17:44:23
【问题描述】:

我有一个shared_ptrs 的容器,我将这些对象交给 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 是否有办法。 Aka 我正在寻找容器来接受 RawPtr 和 shared_ptr 来定位 shared_ptr 项目。问题是我不能将CFoo* 隐式转换为shared_ptr(出于我理解的原因)。

我想我可以做到

m_gSet.erase(shared_ptr&lt;CFoo&gt;(pRawPtr, _do_not_delete_deleter))

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

【问题讨论】:

    标签: c++ stl map set shared-ptr


    【解决方案1】:

    为什么不是显而易见的方式?遍历容器,然后

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

    编辑:要利用 O(logN) 查找,您可以做任何您想做的事情(即,使用 no_op 删除器创建 shared_ptr)。它可能很丑,但并不危险

    【讨论】:

    • 是的,我可以这样做,但是像 set 和 map 这样的容器允许 O(LogN) 查找,而该方法会使我回到 O(N)。我希望不要丢失 O(LogN) 查找。
    • 那么你会选择使用 intrusive_ptr 还是将这种情况作为首先使用 intrusive_ptr 的论据? (转换为 shared_ptr 将在后台执行一些分配)
    • @BabelFish:幸运的是,删除器不是共享指针的模板参数!所以不需要演员表
    • 我的意思是,通过将 ptr 转换为 shared_ptr 将导致在后台分配(参考信息的分配))。很抱歉造成混乱
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 2018-08-26
    • 1970-01-01
    • 2014-03-25
    • 2019-10-20
    • 2014-10-08
    • 1970-01-01
    相关资源
    最近更新 更多