繁体   English   中英

如何在循环中初始化QList中的对象

[英]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()。

尝试使用appendpush_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM