QnetWorkreply抛出sigsegv时发出的信号



我的应用程序利用QNetworkReply的发送和接收静止API的数据。

有许多教程可用于与qnetworkAccessManager

一起使用qnetworkreply

曾经我使用的示例曾经可以在这里甚至在这里找到

基本用法:

//标题

QNetworkAccessManager *manager;
QNetworkReply *myReply;
QMetaObject::Connection conReply;

//提出请求

void MainWindow::makeRequest(QString url) {
    //...
    QNetworkRequest request(QUrl(url));
    myReply = manager->get(request) // or post(request)
    conReply = QObject::connect(myReply, SIGNAL(finished()), this,  SLOT(myReplyResponse()));
}

//处理请求

void MainWindow::myReplyResponse(){
    QObject::disconnect(conReply);
    QByteArray data = myReply->readAll();
    // or QByteArray data = myReply->read(myReply->bytesAvailable());
    myReply->deleteLater();
    // do something with this data
    //...
}

使用类似的实现,我每x秒请求数据。

问题:

接收finished()信号时,触发处理该答复的代码,但是在阅读数据时,我会得到SIGSEGV

这个问题似乎是随机发生的,因此我无法确定什么触发它。

任何建议都会很乐意接受。

可能发生的事情是它延迟了订单,假设每秒发送订单,但需要2秒钟才能复制,2秒后,您已经阅读了答复,并且您从内存中删除了它,当另一个来了,是一个空指针。您必须做的就是使用sender()获取复制品,并且建议始终验证您没有空指针:

*。h

private:
    QNetworkAccessManager *manager;

*。cpp

[...]
manager = new QNetworkAccessManager(this);
[...]
void MainWindow::makeRequest(const QString &url)
{
    Qurl mUrl(url);
    QNetworkRequest request(mUrl);
    QNetworkReply *myReply = manager->get(request); // or post(request)
    connect(myReply, &QNetworkReply::finished, this,  &MainWindow::myReplyResponse);
}
void MainWindow::myReplyResponse()
{
    QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
    if(reply){
        QByteArray data = reply->readAll();
        qDebug()<<data;
        reply->deleteLater();
    }
}

相关内容

  • 没有找到相关文章

最新更新