我有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();
}
如您所见,正在调用删除。
答案 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
};
};
如您所见,指针既不大也不静,所以不会删除