4

我有一组共享指针:

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

和一个指针:

T* p;

我想有效地set删除等于的元素p,但我不能对 set 的任何成员或任何标准算法执行此操作,因为T*它与boost::shared_ptr<T>.

我能想到的几种方法是:

  • 以某种方式从指针构造一个新的 shared_ptr ,该指针不会获得指向内存的所有权(理想的解决方案,但我看不到如何做到这一点)
  • 包装/重新实现 shared_ptr 以便我可以执行上述操作
  • 只是对集合进行我自己的二进制搜索
4

3 回答 3

9

shared_ptr<T>Ta构造 a 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。

于 2010-03-28T11:20:36.350 回答
1

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

于 2010-03-28T11:00:21.377 回答
1

boost::ptr_set如果您希望集合拥有对象的所有权,或者boost::reference_wrapper您只希望集合存储对它们的引用,则可以使用。如果您shared_ptr在代码中的一个地方使用它,您将不得不在所有地方都使用它,否则会有严重崩溃的风险(悬空指针、已删除的对象等)。一个例外是weak_ptr,一个指向由 a 持有shared_ptr但不共享所有权的对象的指针。

于 2010-03-28T11:09:44.207 回答