我有一组共享指针:
std::set<boost::shared_ptr<T>> set;
指针:
T* p;
我希望有效地删除set
等于p
的元素,但我无法对任何set的成员执行此操作,或者任何标准算法,因为T*
是与boost::shared_ptr<T>
完全不同的类型。
我能想到的几种方法是:
答案 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
所持有的对象,但不共享所有权。