在QT中删除QStringList

Delete QStringList in Qt

本文关键字:QStringList 删除 QT      更新时间:2023-10-16

在qt中,我知道,如果您创建一个从qObject继承并设置其父的对象,则父责任删除孩子。我也明白,如果您在堆栈上创建对象,则在它们脱离范围时被删除。

我没有将头缠绕在我想在QStringList(或任何QLIST)中明确删除项目的情况,然后删除列表本身。

考虑我是否创建QStringList并像以下那样填充它:

QStringList multiPartPortionList;
multiPartPortionList = multiPartPortion.split(QRegExp("[rn]"),QString::SkipEmptyParts);

然后我使用它并调用此方法以明确删除列表中包含的项目,然后删除列表本身:

void MyClass::deleteList(QStringList list) {
    // Now cleanup
    QStringList *delList = new QStringList(list);
    int numObjects = delList->count();
    for (int i=0; i < numObjects; i++)
        delete (new QString(list.takeAt(0)));
    delList->clear();
    delete delList;
    delList = 0;
}

我无法称呼qdeleteall(列表),因为它期望指针,而且我也不能只做:

delete list;

由于它与'错误'delete'的参数错误,预期的指针',期待指针。

我得到了分割错误:

void MyClass::deleteList(QStringList list) {
    // Now cleanup
    QStringList *delList = &list; // <--- Seg fault with this
    int numObjects = delList->count();
    for (int i=0; i < numObjects; i++)
        delete (new QString(list.takeAt(0)));
    delList->clear();
    delete delList;
    delList = 0;
}

我还会得到以下分段错误:

void MyClass::deleteList(QStringList list) {
    // Now cleanup
    QStringList *delList = &list;
    int numObjects = delList->count();
    for (int i=0; i < numObjects; i++)
        delete &(list.takeAt(0)); // <--- Seg fault with this
    delList->clear();
    delete delList;
    delList = 0;
}

,然后我也得到了分段错误:

void MyClass::deleteList(QStringList list) {
    // Now cleanup
    QStringList *delList = new QStringList(list);
    int numObjects = delList->count();
    for (int i=0; i < numObjects; i++)
        delete (new QString(list.takeAt(0)));
    delList->clear();
    delete delList;
    delList = 0;
    delete &list; // <--- Seg fault with this
}

我认为这是不太合适的,甚至不太接近正确的。我如何最好地实现我想要的 - 那是明确删除列表中的所有项目,然后删除列表本身?

您的QStringList list在功能末尾自动删除。无需担心在此处删除指针。

以相同的方式,

QStringList *delList = new QStringList(list);

应该是

QStringList delList = QStringList(list);

更好:

QStringList delList = list;

您应该阅读有关自动存储和RAII的信息。在您的代码中,newdelete是多余的。

要删除列表中的元素,请使用removeat。这与删除无关。

我还建议您在继续在C 之前得到一本好书。