删除QNetworkReply*回复导致代码外的SIGSEGV
Delete QNetworkReply *reply cause SIGSEGV outside of the code?
我写了一个简单的程序来自动设置路由器。经过检查,我发现一个指针需要是delete
(replyFinish()
中的QNetworkReply *reply
),并完成了这项工作,但在那之后,程序崩溃和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();
}
根据文档:
注意:请求完成后用户可以在适当的时间删除CCD_ 4对象。不要直接在连接到CCD_ 5的插槽内删除。你可以使用
deleteLater()
函数。
此外,由于
nam = new QNetworkAccessManager(this);
创建一个以this
为其父级的新QNetworkAccessManager
,而QObject
的析构函数将自动删除其所有子级,则httpGetter
的析构器中的delete nam;
是不必要的,最终将导致双重删除。
相关文章:
- 创建LinkedList退出,返回代码为-11(SIGSEGV)
- 分段故障 运行C++代码时出现 SIGSEGV
- 为什么我的递归代码给出 sigsegv 错误?
- 在使用堆栈为下一个最大数字编写代码时面临 SIGSEGV(分段错误)
- 在Hackerearth上获取运行时错误(SIGSEGV),无法找出代码中的问题
- 我的代码上的运行时错误 sigsegv
- 为什么我的代码中出现'Runtime Error - SIGSEGV'?
- 程序接收了信号sigsegv,在代码块中调试时的细分故障
- 我不知道为什么只有一个代码在两个代码之间具有sigsegv(看起来相同)
- Android原生libc信号11(SIGSEGV),代码2(SEGV_ACCERR),故障地址
- 代码中奇怪的SIGSEGV错误
- NDK:0xdeadd00d时虚拟机中止和致命信号 11 (SIGSEGV) 的问题(代码 = 1)
- CodeChef 中代码的运行时错误 (SIGSEGV)
- 如何在我的代码中解决 SIGSEGV
- 以下代码中存在运行时-sigsegv错误
- 代码中存在无法预测的SIGSEGV(运行时错误)
- 删除QNetworkReply*回复导致代码外的SIGSEGV
- 无法弄清楚为什么此代码在发送数据包数据时会导致 SIGSEGV
- 某些lua/c++代码中出现SIGSEGV错误
- 在GCC中编写SIGSEGV代码,但不在Clang中