6

我需要一个指针容器来获得指针的所有权——即当一个元素被删除,或者容器超出范围时,它会释放它的所有指针,比如在boost::ptr_vector.

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

现在我正在使用QList<QSharedPointer<AbstractClass> >,但感觉有点矫枉过正,因为它的引用计数和用于多线程的昂贵互斥锁。

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

4

2 回答 2

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 没有移动构造函数或运算符,这是设计使然。

于 2014-12-17T10:43:00.353 回答
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 类型的开销要大得多。

于 2014-12-17T10:53:23.110 回答