[英]How to initialize Objects in a QList in a loop
在我的课堂上,我有一个成员变量。
QProcess* p1;
在一些函数中,我初始化并将其用作:
process1 = new QProcess();
它工作正常。 现在,我遇到了许多要启动的过程。 一种选择是将它们全部声明为成员函数:
QProcess* p1;
QProcess* p2;
QProcess* p3;
...
然后在需要时初始化所有它们。 但是,这是多余的工作。 所以我试图创建一个列表并在这样的循环中将其初始化:
QList<QProcess*> procList;
for(int i=0; i<len; i++){
procList[i] = new QProcess();
}
它编译正常,但随后崩溃。 是否缺少某些东西,或者我在做什么错?
我还尝试将所有成员变量添加到此列表中,例如:
for(int i=0; i<len; i++){
switch(i){
case 0:
procList[i] = p1;
break;
}
}
但这也有和上面一样的结果
编辑:
根据您的建议,我尝试了:
procList.append(new QProcess());
以及procList.append(p1);
但是结果是一样的,它编译但在运行时崩溃
编辑:所以我发现问题完全无关。 我使用此代码的类本身(我制作的自定义类)没有默认的构造函数。 正如我在没有默认构造函数的情况下所学到的,如果您初始化一个指针,它就会以某种方式崩溃...。 指定默认构造函数后,它现在可以正常工作。
您正在访问未分配的内存区域。 您的列表为空,您访问的元素无效。 根据文档: https : //doc.qt.io/qt-5/qlist.html#operator-5b-5d
T&QList :: operator [](int i)返回索引位置i处的项目作为可修改的引用。 我必须是列表中的有效索引位置 (即0 <= i <size())。
如果在当前正在共享的列表上调用此函数,它将触发所有元素的副本。 否则,此功能将以恒定时间运行。 如果您不想修改列表,则应使用QList :: at()。
尝试使用append
或push_back
,请参见https://doc.qt.io/qt-5/qlist.html#push_back
PS:不是QT专家,但是如果可能的话,您可能想研究std::unique_ptr
的QList来管理您的内存。 否则,您可能会忘记删除其指针存储在列表中的已分配堆的元素。
编辑 :OP报告该建议不起作用。 我自己写了一个小例子(不考虑可能的泄漏)。 以下示例在使用operator[]
时崩溃,但在调试模式下可与append
配合使用(我将QT Creator用于Windows,将Qt 5.13.0用于MinGW 64位)。 OP正在遇到的问题可能是工具链出现问题,也可能是在append
之前触发的未定义行为。 我建议OP尝试将我的代码复制/粘贴到一个干净的项目中并运行它。
#include <QList>
#include <QProcess>
int main()
{
QList<QProcess*> list;
for(int i = 0; i < 10; ++i){
QProcess * p = new QProcess();
//Decomment and crash
//list[i] = p;
//does not crash
list.append(p);
}
//Here you should cleanup
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.