c++ - QNetworkReply 在发出完成信号时抛出 SIGSEGV

标签 c++ qt qnetworkaccessmanager qnetworkreply qnetworkrequest

我的应用程序使用 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

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

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

最佳答案

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

关于c++ - QNetworkReply 在发出完成信号时抛出 SIGSEGV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47947843/

相关文章:

c++ - C++代码中的尾递归优化

C++ LoadLibrary 返回 Null

c++ - 变量不能出现在常量表达式中

python - 绑定(bind) C++ 和 Python 时,SWIG 在使用 MinGW-w64 的 Windows 上不起作用 : DLL load failed while importing: The specified module could not be found

qt - Autodesk Maya 模型面板调整大小事件

c++ - 对 boost 序列化函数的 undefined reference

QteSTLib:未执行 QNetworkRequest

c++ - 如何向现有 QTableWidget 添加新行?

Qt QNetworkAccessManager & 简单的Web服务返回

qt - QNetworkAccessManager - 如何发送 "PATCH"请求