我需要一个获取指针所有权的指针容器 - 即当一个元素被删除,或者容器超出范围时,它会释放所有指针,就像在boost::ptr_vector
中一样。
QList<QScopedPointer<AbstractClass> >
不起作用(编译错误,没有复制构造函数?)。
现在我正在使用QList<QSharedPointer<AbstractClass> >
,但感觉就像是一种过度杀伤,其引用计数和多线程的昂贵互斥量。
编辑:我刚刚了解了QPtrList(感谢@ForEveR),这在Qt3中非常相同,但已从更高版本中删除。我只是不明白他们为什么会删除它。
答案 0 :(得分:4)
你说对,QSharedPointer因为上述原因而有点开销。
不幸的是,在Qt中没有这样的指针向量,当语言发展并且我们已经有了很好的原语来做类似的工作时,是否值得添加也有点疑问。
我刚刚与一位Qt核心开发人员进行了快速讨论,而今天推荐的解决方案似乎是QSharedPointer或来自C ++ 11:
std::vector<std::unique_ptr<AbstractClass>>
不要尝试使用QVector而不是std :: vector,因为QVector可能想要复制。
即使在C ++ 11中,也不要尝试使用此解决方案:
QList<QScopedPointer<AbstractClass>>
这里的问题是QList想要复制。当使用任何非const方法时,将调用detach来创建副本,而不会编译。
此外,QScopedPointer没有移动构造函数或运算符that is by design。
答案 1 :(得分:0)
基于Qt概念的另一个想法:
您可以从QObject派生列表中的指针显示的对象,并添加一个小的基于QObect的类,该类保存列表的所有权。每个指针(将添加到此基于QObject的新列表)必须将拥有列表类设置为其父级。 现在,基于QObject的列表容器将在释放时使用Qt机制进行清理。
class Ptr : public QObject {
};
class MyList : public QObject {
QList<Ptr> m_myList;
public:
void add( Ptr *item ) {
m_mylist.push_back( item );
item->setParent( this );
}
};
您可以在此处找到有关Qt对象树所有权的更多信息:http://qt-project.org/doc/qt-4.8/objecttrees.html。
当然,这比使用像std :: unique_ptr这样的小型C ++-11类型要多得多。