我写了一个简单的程序来自动化设置路由器的过程。检查后,我发现一个指针需要被 delete
(QNetworkReply *reply
in replyFinish()
) 并完成这项工作,但在那之后程序崩溃,Qt 显示它在某些汇编代码中停止了:(
所以我的问题是:
是否有任何常见的做法来处理这种情况(Qt 显示程序在某些汇编代码中停止)
删除不再使用的指针时我做错了什么? (对此非常确定)
代码如下:
#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 tofinished()
. You can use thedeleteLater()
function.
此外,由于
nam = new QNetworkAccessManager(this);
创建一个新的 QNetworkAccessManager
并将 this
作为其父级,QObject
的析构函数将自动删除其所有子级,您的 delete nam;
在 httpGetter
的析构函数中是不必要的,最终会导致双重删除。
关于c++ - 删除 QNetworkReply *reply 导致代码外的 SIGSEGV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25629393/