使用 QLabel 的 QList 时程序崩溃
Program crashes when using QList of QLabel
我制作了一个 window,按下按钮即可打开。
在这个 window 中,我创建了一个包含 38 个 QLabel 的 QList :QList<QLabel*> Nombres;
我这样分配它:
for(int i = 0; i <= 38; i++)
{
Nombres.push_back(new QLabel(QString::number(i)));
}
但是当我打开 window 时,程序有时会崩溃,有时不会。有时,当我关闭 window 时它会崩溃。是随机的。
我试过使用 table 而不是 QLabels,但还是有同样的问题
程序崩溃并出现错误:损坏的双链表:0x00000000019499b0 ***
有什么解决办法吗?
问题可能是指针在其他地方被删除了。您的代码没有特别的问题,但这是内存分配管理不善的一个例子。
编辑:在C++中,你必须知道谁拥有所有的指针。一些函数拥有所有权,比如添加一个指向 QDialog 的 QLabel 指针。你不能把同一个东西送人两次。一旦您将数字标签赋予对话框,您就不再拥有它。如果你放弃它两次(在你的例子中两次将相同的 QLabel 放在任何对话框上),它将被删除两次,导致未定义的行为和崩溃。
我制作了一个 window,按下按钮即可打开。
在这个 window 中,我创建了一个包含 38 个 QLabel 的 QList :QList<QLabel*> Nombres;
我这样分配它:
for(int i = 0; i <= 38; i++)
{
Nombres.push_back(new QLabel(QString::number(i)));
}
但是当我打开 window 时,程序有时会崩溃,有时不会。有时,当我关闭 window 时它会崩溃。是随机的。
我试过使用 table 而不是 QLabels,但还是有同样的问题
程序崩溃并出现错误:损坏的双链表:0x00000000019499b0 ***
有什么解决办法吗?
问题可能是指针在其他地方被删除了。您的代码没有特别的问题,但这是内存分配管理不善的一个例子。
编辑:在C++中,你必须知道谁拥有所有的指针。一些函数拥有所有权,比如添加一个指向 QDialog 的 QLabel 指针。你不能把同一个东西送人两次。一旦您将数字标签赋予对话框,您就不再拥有它。如果你放弃它两次(在你的例子中两次将相同的 QLabel 放在任何对话框上),它将被删除两次,导致未定义的行为和崩溃。