【发布时间】:2025-11-23 11:05:01
【问题描述】:
我有一个 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();
}
如您所见,调用了一个删除操作。
【问题讨论】:
-
当然,删除是在内部节点上调用的,而不是在您的指针上。在这种情况下,
T* n->v是由QList分配的。