Phi*_*Bot 0 c++ qt memory-leaks memory-management
在Qt中,我理解如果您创建一个继承自QObject的对象并将其设置为父对象,则父对象负责删除子对象.我也明白,如果你在堆栈上创建对象,当它们超出范围时会被删除.
我并没有围绕我想要显式删除QStringList(或任何QList)中的项目然后是列表本身的情况.
考虑我是否创建了一个QStringList并填充如下:
QStringList multiPartPortionList;
multiPartPortionList = multiPartPortion.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);
Run Code Online (Sandbox Code Playgroud)
然后我用它做一些事情并调用此方法以尝试显式删除列表中包含的项目,然后是列表本身:
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;
}
Run Code Online (Sandbox Code Playgroud)
我不能调用qDeleteall(list)因为它需要一个指针,而我也做不到:
delete list;
Run Code Online (Sandbox Code Playgroud)
因为它'给'删除',预期指针'的参数错误,期望一个指针.
我得到了分段错误:
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;
}
Run Code Online (Sandbox Code Playgroud)
我也得到了分段错误:
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;
}
Run Code Online (Sandbox Code Playgroud)
然后我也得到了分段错误:
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
}
Run Code Online (Sandbox Code Playgroud)
我不认为这是正确的,甚至是接近的.我怎样才能最好地实现我想要的 - 即明确删除列表中的所有项目,然后是列表本身?
您QStringList list将在函数结束时自动删除.无需担心在这里删除指针.
以相同的方式,
QStringList *delList = new QStringList(list);
Run Code Online (Sandbox Code Playgroud)
应该
QStringList delList = QStringList(list);
Run Code Online (Sandbox Code Playgroud)
更好的是:
QStringList delList = list;
Run Code Online (Sandbox Code Playgroud)
您应该阅读有关自动存储和RAII的信息.在你的代码中,new并且delete是多余的.
要删除列表中的元素,请使用removeAt.这与删除无关.
我还建议你在继续使用C++之前得到一本好书.