【问题标题】:Delete QNetworkReply *reply cause SIGSEGV outside of the code?删除 QNetworkReply *reply 导致代码之外的 SIGSEGV?
【发布时间】:2014-09-02 17:51:14
【问题描述】:

我编写了一个简单的程序来自动化设置路由器的过程。经过检查,我发现指针需要为deletereplyFinish()中的QNetworkReply *reply)并完成这项工作,但之后程序崩溃并且Qt显示它在一些汇编代码中停止:(

所以我的问题是:

  1. 是否有任何常见的做法来处理这种情况(Qt 显示程序在某些汇编代码中停止)

  2. 删除不再使用的指针时我做错了什么? (很确定)

代码如下:

#ifndef HTTPGETTER_H
#define HTTPGETTER_H
class QNetworkAccessManager;
class QNetworkReply;
class QNetworkRequest;
class QAuthenticator;
#include <QObject>

class httpGetter : public QObject
{
    Q_OBJECT
private:
    QNetworkAccessManager *nam;
public:
    explicit httpGetter(QObject *parent=0);
    ~httpGetter();
public slots:
    void replyFinish(QNetworkReply* reply);
    void onAuthen(QNetworkReply*,QAuthenticator*);
};

实现

#include "httpgetter.h"
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkAccessManager>
#include <QAuthenticator>
#include <QDebug>
httpGetter::httpGetter(QObject *parent) : QObject(parent)
{
    nam = new QNetworkAccessManager(this);
    QObject::connect(nam,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinish(QNetworkReply*)));
    QObject::connect(nam,SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),this,SLOT(onAuthen(QNetworkReply*,QAuthenticator*)));

    QUrl url("http://192.168.1.1");
    QNetworkReply *reply= nam->get(QNetworkRequest(url));


}
httpGetter::~httpGetter(){
    delete nam;
}
void httpGetter::replyFinish(QNetworkReply *reply)
{
    if (reply==NULL) {
        qDebug() << "NULL reply";
        return;
    }

    QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);

    qDebug() << statusCode.toString();

    if (reply->error()==QNetworkReply::NoError) {
        qDebug() << "NICE reply";
        QByteArray bytes = reply->readAll();
        QString answer = QString(bytes);
        qDebug()<< answer;
    }

    else {
        qDebug() << "reply error";
    }

    //delete reply; ==> delele cause sigsegv, if don't the program run like a     while(true)
    //reply == NULL;

}

void httpGetter::onAuthen(QNetworkReply* rep,QAuthenticator* auth)
{
    if ( rep==NULL || auth == NULL) {
        qDebug()<< "reply or authentication pointer is null";
        return;
    }

    qDebug()<< rep->readAll();
    auth->setUser("rolan");
    auth->setPassword("123456");
}

主要

#include <QtCore/QCoreApplication>
#include "httpgetter.h"


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    httpGetter abc;




    return a.exec();
}

【问题讨论】:

    标签: c++ qt segmentation-fault


    【解决方案1】:

    根据the documentation

    注意:请求完成后,由 用户在适当的时候删除QNetworkReply 对象。不要 直接在连接finished()的槽内删除。你可以 使用deleteLater() 函数。

    还有,因为

    nam = new QNetworkAccessManager(this);
    

    创建一个新的QNetworkAccessManager,以this作为其父级,QObject的析构函数将自动删除其所有子级,您在httpGetter的析构函数中的delete nam;是不必要的,最终会导致双重删除。

    【讨论】:

    • 看来我们几乎同时发布了“相同的答案”。你是第一个,所以我会删除我的并留下这个评论,说明这个答案是正确的,在我看来。
    • 嗨,我关注了this guide。也许它已经过时了。在标记这个问题的答案之前,你能告诉我有什么常见的做法来处理这种情况:Qt stop in some assembly code?​​span>
    • PS:向你致敬@mhcuervo;你很好:)
    • 顺便说一句,你能解释一下为什么即使我调用reply-&gt;close() 输出控制台仍然“挂起”而不退出程序(显示:​​press enter to continue...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    相关资源
    最近更新 更多