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

Posted

技术标签:

【中文标题】QNetworkReply 在发出完成信号时抛出 SIGSEGV【英文标题】:QNetworkReply throwing SIGSEGV when finished signal emitted 【发布时间】:2017-12-22 22:00:47 【问题描述】:

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

有很多教程可用于使用QNetworkReply 和QNetworkAccessManager

一旦我使用的这样的例子可以找到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

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

我们很乐意接受任何建议。

【问题讨论】:

您是否通过调试器运行您的应用程序?我假设您正在访问该数据缓冲区中实际上不存在的内存。 【参考方案1】:

可能发生的情况是它延迟了订单,假设每秒发送一个订单,但复制需要 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();
    

【讨论】:

太棒了。没关系(和我一起)。谢谢!

以上是关于QNetworkReply 在发出完成信号时抛出 SIGSEGV的主要内容,如果未能解决你的问题,请参考以下文章

QNetworkReply 未被删除

QNetworkReply 未发出 downloadProgress

不会发出信号

RestKit 在 PUT 请求时抛出 NSInternalInconsistencyException

QNetworkAccessManager 不发出信号

为啥mysql PDO不会在失败时抛出错误[重复]