Qt QList - removeAll释放内存

时间:2015-08-10 11:47:45

标签: c++ qt qlist

我有QList MyClass个像这样的指针:

QList<MyClass*> myList;

当我致电myList.removeAll(someObjPtr);时,它不会从QList中删除指针,它会在内部调用delete。有没有办法解决这个问题,还是有一种替代的QList方法可以在不解除分配的情况下删除元素?

编辑:removeAll的内部结构:

template <typename T>
Q_OUTOFLINE_TEMPLATE int QList<T>::removeAll(const T &_t)
{
    int index = indexOf(_t);
    if (index == -1)
        return 0;

    const T t = _t;
    detach();

    Node *i = reinterpret_cast<Node *>(p.at(index));
    Node *e = reinterpret_cast<Node *>(p.end());
    Node *n = i;
    node_destruct(i);
    while (++i != e) {
        if (i->t() == t)
            node_destruct(i);
        else
            *n++ = *i;
    }

    int removedCount = e - n;
    d->end -= removedCount;
    return removedCount;
}

你可以看到它调用node_destruct,它执行此操作:

template <typename T>
Q_INLINE_TEMPLATE void QList<T>::node_destruct(Node *n)
{
    if (QTypeInfo<T>::isLarge || QTypeInfo<T>::isStatic) delete reinterpret_cast<T*>(n->v);
    else if (QTypeInfo<T>::isComplex) reinterpret_cast<T*>(n)->~T();
}

如您所见,正在调用删除。

2 个答案:

答案 0 :(得分:5)

QList与Qt 3&{39} QPtrList无关。

QList方法都没有以特殊方式解释存储的指针。你必须错误地测试它。例如,下面的代码很高兴地泄漏了两个C实例,并且从不删除它们。

也许您在考虑来自qDeleteAll的{​​{1}}?这个删除实例。

请注意,QtAlgorithms的实现可能会分配每项内存来存储您的实例,并在适当时释放该内存。在任何情况下,QList实现都不会删除您存储在列表中的指针:QList解释存储数据的唯一方法是通过其类型,然后它只决定是否项目是可记忆的,它们是否适合QList或者它们是否需要单独分配。实际上,所有指针类型都存储在void*中,好像它是QList一样,在开头和结尾添加了一些空间来构建QVector }和push_front摊销了O(1)费用。

push_back

答案 1 :(得分:0)

node_destruct不会删除QLists指向的对象。如果仔细观察,它只会删除大型和静态类型的n->v。 QList在堆内部分配大型和静态类型,因此删除是必要的。

对于指针类型,QTypeInfo<T>专业化是:

template <typename T>
class QTypeInfo<T*>
{
public:
    enum {
        isPointer = true,
        isComplex = false,
        isStatic = false,
        isLarge = false,
        isDummy = false
    };
};

如您所见,指针既不大也不静,所以不会删除