c++ - 删除 QNetworkReply *reply 导致代码外的 SIGSEGV?

标签 c++ qt segmentation-fault

我写了一个简单的程序来自动化设置路由器的过程。检查后,我发现一个指针需要被 delete (QNetworkReply *reply in replyFinish()) 并完成这项工作,但在那之后程序崩溃,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();
}

最佳答案

根据 the documentation :

Note: After the request has finished, it is the responsibility of the user to delete the QNetworkReply object at an appropriate time. Do not directly delete it inside the slot connected to finished(). You can use the deleteLater() function.

此外,由于

nam = new QNetworkAccessManager(this);

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

关于c++ - 删除 QNetworkReply *reply 导致代码外的 SIGSEGV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25629393/

相关文章:

c++ - 线程的子线程?

C++ - 在成员函数内初始化成员变量?

c++ - 如何在 Qt 中获得与 CSS 规则 `display: inline-block` 相同的行为?

qt - 当您在 QtCreator 中推广小部件时会发生什么?

c++ - "this"关键字导致段错误

c - C 编程中未知边界用法的数组

Apache Thrift 教程中的 C++ 链接器错误 - undefined symbol

c++ - 在 Win32(非 MFC)中获取/设置组合框文本

c++ - 使 Qt/C++ 程序显示其在 Windows 上已知的文件类型

c - printf 导致 getlogin() 出现段错误