Qt相当于boost :: ptr_vector?

时间:2014-12-17 10:16:01

标签: c++ qt qtcore qsharedpointer qscopedpointer

我需要一个获取指针所有权的指针容器 - 即当一个元素被删除,或者容器超出范围时,它会释放所有指针,就像在boost::ptr_vector中一样。

QList<QScopedPointer<AbstractClass> >不起作用(编译错误,没有复制构造函数?)。

现在我正在使用QList<QSharedPointer<AbstractClass> >,但感觉就像是一种过度杀伤,其引用计数和多线程的昂贵互斥量。

编辑:我刚刚了解了QPtrList(感谢@ForEveR),这在Qt3中非常相同,但已从更高版本中删除。我只是不明白他们为什么会删除它。

2 个答案:

答案 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类型要多得多。