Qt段错误集录(RtlWerpReportException failed with status code :-1073741823. Will try to launch the process)
Qt中经常出现段错误,其原因大多是内存问题,形式如下:
RtlWerpReportException failed with status code :-1073741823. Will try to launch the process directly
或
Segmentation Fault
这种错误在Linux下通常称为“段错误”,错误原因一般是内存问题,如访问了空指针、堆栈溢出、内存泄漏等,发生错误后第一件事就是检查内存调用,有没有堆上的内存使用后没有释放、指针被访问时是否是一个有效值什么的。
将我编程生涯中遇到的段错误在这篇博客中集录:
1、在ui->setupUi(this);
之前调用UI
今天在优化程序的过程中碰到了一个很有意思的问题,只是加了几个UI控件的属性设置,居然提示段错误!? 研究之后找到错误原因:
在ui->setupUi(this);
之前进行了UI控件的调用。
没有将UI绑定到当前类就进行调用,当然会有问题。
2、tcp套接字建立连接后未关闭就置空
由于套接字连接已经建立,没有关闭连接就置为NULL,别人发数据过来时找不到地址,自然段错误;
且看我这个TCP套接字的生命周期:
//头文件中
private:
QTcpSocket *tcpSocket;//通信套接字
//源文件中
//构造函数中
tcpSocket = NULL;
......
//连接建立信号槽中
tcpSocket = tcpServer->nextPendingConnection();
QString ip = tcpSocket->peerAddress().toString();
qint16 port = tcpSocket->peerPort();
...............
//断开连接槽函数中
tcpSocket->disconnectFromHost();
tcpSocket->close();
tcpSocket = NULL;
如果在网络延迟的影响下,close函数和disconnectFromHost都被延迟了,或者两者都在等待输入缓冲而没有立即生效,套接字没有关闭的情况下将其置为NULL,数据过来的时候,发现地址变为NULL了,段错误; 上述代码中,将disconnectFromHost和close都屏蔽时,百分百报错。
3、当tcpSocket 为空时,调用tcpSocket->disconnectFromHost();
段错误
与2在一个程序,不赘述。注意:不管是disconnectFromHost还是close,都不会对套接字的地址造成影响。
4、指向不存在的索引
多见于QByteArray、数组、向量中
例如,读取的QByteArray数据长度不够时,输出数据某个索引值,即使是用QDebug输出;
qDebug()<<array.size()<<endl<<array.at(0)<<endl<<array.at(19)<<array<<endl
当读取到的数据没有19位,触发QByteArray的断言:
inline char QByteArray::at(int i) const
{ Q_ASSERT(uint(i) < uint(size())); return d->data()[i]; }
断言不通过,程序崩溃,段错误。
5、数组越界
例如:在一个TCP服务器程序中,每来一个客户端连接,就启动一个定时器,想用定时器个数限制客户端个数,在头文件中声明了一个定时器数组,个数为10,当连接超过10个时,段错误。
解决方法:在客户端连接的函数里,定时器用局部变量。限制客户端连接数用:
tcpServer->setMaxPendingConnections(5);
但在我的程序里貌似并不起作用,我用的
tcpServer->close();
用一个标识符记录客户端个数,达到目标个数调用上述函数,服务器不再监听新的连接:
Closes the server. The server will no longer listen for incoming connections.
6、使用Qcustomplot时,addgraph
后调用graph()
调用graph()
需要传入参数,参数范围为0-addgraph
调用的次数,如果不在这个范围,会提示:
7、QButtonGroup引用问题
QButtonGroup是Qt中的按钮组,可以添加许多按钮,当需要所有按钮只允许同一时刻只能有一个按钮被选中,设置
setExclusive(false);
添加按钮时,有两种方法:
BtnGroup->addButton(Button); //按钮
或
BtnGroup->addButton(Button,0);//按钮,ID
当以第二种方式添加按钮时,指定按钮组中的按钮:
BtnGroup->buttons().at(0)->setEnabled(false);
或
BtnGroup->button(1)->setEnabled(false);
但是,以第一种方法添加的按钮,只能用
BtnGroup->buttons().at(0)->setEnabled(false);
如果用
BtnGroup->button(1)->setEnabled(false);
会段错误,因为button(1)
括号里面的是ID
而不是index
,必须先给按钮添加ID
才能使用,buttons().at(0)
括号里面的才是index
。
待续……