欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qt段错误集录(RtlWerpReportException failed with status code :-1073741823. Will try to launch the process)

程序员文章站 2022-04-19 16:36:48
...

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调用的次数,如果不在这个范围,会提示:
Qt段错误集录(RtlWerpReportException failed with status code :-1073741823. Will try to launch the process)

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
待续……

相关标签: Qt 段错误