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

原文链接:https://blog.csdn.net/qq_40194498/article/details/79853946

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值