在Qt中,我理解如果您创建一个从QObject继承并设置其父对象的对象,那么父对象负责删除这些子对象。我还了解到,如果在堆栈上创建对象,则当对象超出作用域时,这些对象将被删除。
我并不是想要显式地删除QStringList (或任何QList )中的项目,然后删除列表本身的情况。
考虑一下,如果我创建了一个QStringList并按如下方式填充它:
QStringList multiPartPortionList;
multiPartPortionList = multiPartPortion.split(QRegExp("[\r\n]"),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;因为它错误的‘参数给’删除‘,预期指针’,期待一个指针。
我通过以下几个方面得到分段错误:
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
}我不认为这是完全正确的,甚至是接近正确的。如何才能最好地实现我想要的--即显式删除列表中的所有项目,然后删除列表本身?
发布于 2012-10-30 20:58:01
在函数的末尾自动删除QStringList list。无需担心删除这里的指针。
以同样的方式,
QStringList *delList = new QStringList(list);应该是
QStringList delList = QStringList(list);更好的是:
QStringList delList = list;你应该读有关自动存储和RAII的文章。在您的代码中,new和delete是多余的。
若要删除列表中的元素,请使用removeAt。这与删除无关。
我还建议您在继续使用好书之前先得到一个C++。
https://stackoverflow.com/questions/13147427
复制相似问题