从std :: set <shared_ptr <t>&gt;中删除通过T * </shared_ptr <t>

时间:2010-03-28 10:57:21

标签: c++ boost smart-pointers

我有一组共享指针:

std::set<boost::shared_ptr<T>> set;

指针:

T* p;

我希望有效地删除set等于p的元素,但我无法对任何set的成员执行此操作,或者任何标准算法,因为T*是与boost::shared_ptr<T>完全不同的类型。

我能想到的几种方法是:

  • 以某种方式从指针构建一个新的shared_ptr,它不会占用指向内存的所有权(理想的解决方案,但我看不到怎么做)
  • 包装/重新实现shared_ptr,以便我可以执行上述操作
  • 只是通过集合
  • 进行自己的二元搜索

3 个答案:

答案 0 :(得分:9)

使用shared_ptr<T>T构建null_deleter(请参阅boost:::shared_ptr FAQ)。

struct null_deleter {
    void operator()(void const *) const { }
};

size_t remove_ptr_from_set(std::set<boost::shared_ptr<T>> &set, X* x)
{
    shared_ptr<X> px(x, null_deleter());
    return set.erase(px);
}

这种类型是兼容的,你不必担心你的临时shared_ptr删除任何对象。

或者,正如其中一条评论所说,如果您可以将T更改为继承自enable_shared_from_this,则可以从对象中获取正确的共享ptr。

答案 1 :(得分:1)

如果使用该集合的原因是你需要有效地找到类型为T的指针,那么显而易见的答案就是不要让它成为一组共享指针!相反,将集合包装在一个类中,该类管理集合包含的指针的生命周期。

答案 2 :(得分:1)

如果您希望集合拥有对象的所有权,则可以使用boost::ptr_set;如果您只希望集合存储对它们的引用,则可以使用boost::reference_wrapper。如果您在代码中的某个位置使用shared_ptr,则必须在所有位置使用它,否则可能会发生可怕的崩溃(悬挂指针,已删除的对象等)。例外是weak_ptr,指针指向shared_ptr所持有的对象,但不共享所有权。