QNetworkReply在发出完成信号时抛出SIGSEGV

问题描述 投票:1回答:1

我的应用程序使用QNetworkReply来发送和接收来自RESTful API的数据。

有很多教程可以使用QNetworkReplyQNetworkAccessManager

一旦我使用的这样的例子可以找到here甚至here

基本用法:

//标题

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

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

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

c++ qt qnetworkaccessmanager qnetworkreply qnetworkrequest
1个回答
2
投票

可能发生的是它正在推迟订单,让我们说每秒发送一个订单,但复制需要2秒钟,2秒后你已经阅读了回复并且你已经从内存中删除了它,而另一个是myReply是一个空指针。你必须做的是使用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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.