【发布时间】:2012-11-13 22:16:45
【问题描述】:
我有一个用 Qt 为嵌入式 linux 编写的图形应用程序。此应用程序的一部分是每 250 毫秒更新一次显示屏幕。但是,大约 8-10 小时后,应用程序崩溃并出现“QList:内存不足”错误。我已经隔离了函数和它发生的行(在某种意义上),但我不知道它为什么会发生,因为我没有使用 QList。此函数中唯一有效的代码行位于此问题的末尾。
我意识到 QList 永远不会“缩小”用于保存项目的内存,但我没有在代码中的任何地方使用 QList。我只是调用“setStyleSheet”来在 ui 小部件(标签、文本字段等)上设置各种字体和属性。还有更多代码,但它们都被注释掉了,所以我假设它与 setStyleSheet 有关。有谁知道为什么会这样?如果是这样,你知道解决这个问题的方法吗?我正在使用 Q.t. 4.3 顺便说一句(由于它专门加载在我正在使用的嵌入式系统上)。
非常感谢您的宝贵时间。
if(twc_rx){
ui->label_Rx->setStyleSheet("QLabel { background-color: lime; font: bold 16px 'Arial' }");
}else if(!twc_rx){
ui->label_Rx->setStyleSheet("QLabel { background-color: grey; font: bold 16px 'Arial' }");
}//line 561 to 684
if(twc_tx){
ui->label_Tx->setStyleSheet("QLabel { background-color: lime; font: bold 16px 'Arial' }");
}else{
ui->label_Tx->setStyleSheet("QLabel { background-color: grey; font: bold 16px 'Arial' }");
}if(ats_stat){
ui->label_ATS->setStyleSheet("QLabel { background-color: lime; border-radius: 10; font: bold 16px 'Arial'}");
}else{
ui->label_ATS->setStyleSheet("QLabel { background-color: red; border-radius: 10; font: bold 16px 'Arial'}");
}
if(atp_stat){
ui->label_atp2->setStyleSheet("QLabel { background-color: lime; border-radius: 10; font: bold 16px 'Arial'}");
}else{
ui->label_atp2->setStyleSheet("QLabel { background-color: red; border-radius: 10; font: bold 16px 'Arial'}");
}
if(ato_stat){
ui->label_ATO->setStyleSheet("QLabel { background-color: lime; border-radius: 10; font: bold 16px 'Arial'}");
}else{
ui->label_ATO->setStyleSheet("QLabel { background-color: red; border-radius: 10; font: bold 16px 'Arial'}");
}
编辑:
我应该提到,这些行基于来自另一个子系统的输入消息每 250 毫秒执行一次。我已经走了那条路,这是一条死胡同。这是错误代码。
【问题讨论】:
-
可能是你忘记释放内存导致内存泄漏。使用valgrind检测
-
问题是这样的:当这些行(或类似的行)被注释掉时,没有错误也没有内存泄漏。我不在我的代码中的其他任何地方使用 QList,除了另一个堆栈分配的位置并且不是每 250 毫秒刷新一次(所以它不会增长到极限)。
-
如果将样式表设置为空字符串会怎样?
-
我会测试一下。失败通常需要 10 个小时左右,所以我明天必须回到这个线程。
标签: qt out-of-memory qlist