使用 QNetworkManager 时出现内存访问错误

Posted

技术标签:

【中文标题】使用 QNetworkManager 时出现内存访问错误【英文标题】:Memory access error when using QNetworkManager 【发布时间】:2016-06-23 07:23:40 【问题描述】:

我对 C++(尽管我对 C 有一些经验)和 QT 还是很陌生。我正在尝试制作一个在用户单击按钮时发布到网站的程序,但是每当我尝试访问 QNetworkManager 时,都会出现内存访问错误。 我的请求对象的代码如下(略微修剪以显示重要部分):

#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QUrl>
#include "cJSON.h"

class unifiedRequests: public QObject 
    Q_OBJECT
public:
// Members
    QString access_token = "";
    bool admin = false;
// Methods
    explicit unifiedRequests(QObject *parent=0);
    QNetworkReply* login_request(QString *email, QString *password);

signals:

public slots:
    void login_complete(QNetworkReply *reply);
    void sslErrorHandler(QNetworkReply*, const QList<QSslError> & );

private:
    QNetworkRequest make_headers(QByteArray endpoint);
    QNetworkRequest make_headers(QByteArray endpoint, QByteArray *access_token);
;

QNetworkRequest unifiedRequests::make_headers(QByteArray endpoint) 
    QString url = endpoint.prepend("https://dali.vpt.co.uk");
    QNetworkRequest request = QNetworkRequest(url);
    qDebug() << "Setting Headers";
    request.setRawHeader("User-Agent", "Desktop Client Debug");
    request.setRawHeader("Content-Type", "application/json");
    qDebug() << "Set headers successfully.";
    return request;


void unifiedRequests::sslErrorHandler
(QNetworkReply* reply, const QList<QSslError> & errors) 
    qDebug() << "Ignoring SSL Errors";
;

QNetworkReply* unifiedRequests::login_request
(QString *email, QString *password) 
    QNetworkRequest request = make_headers("/api/auth");

    qDebug() << "Making JSON";
    cJSON *login_json; //The body of the request
    login_json = cJSON_CreateObject();
    cJSON_AddStringToObject(login_json, "email", email->toUtf8());
    cJSON_AddStringToObject(login_json, "password", password->toUtf8());
    qDebug() << "Made JSON: ";
    qDebug() << cJSON_Print(login_json);

    QNetworkAccessManager *manager =  new QNetworkAccessManager;
    //The object we use to send the request and receive the reply
    qDebug() << "Turning off SSL";
    connect(manager,
        SIGNAL(sslErrors(QNetworkReply*, const QList<QSslError> & )),
        this,
        SLOT(sslErrorHandler(QNetworkReply*, const QList<QSslError> &     )));
    qDebug() << "POSTing login.";
    QNetworkReply *reply = manager->post(request, cJSON_Print(login_json));

    qDebug() << "Connecting signal to slot.";
    QAbstractSocket::connect(manager, SIGNAL(finished(QNetworkReply * )),
                         this, SLOT(login_complete(QNetworkReply * )));
    cJSON_Delete(login_json);
    return reply;

我正在通过调用创建统一请求对象:

unifiedRequests requestObj;

在不同的文件中。它在我尝试关闭 SSL 时崩溃(我们使用的是自签名证书,所以我需要这样做才能发出请求)。有什么想法吗? 谢谢!

【问题讨论】:

“它崩溃了”是什么意思? 你是说你的 connect() 语句崩溃了吗?您可以尝试更新的连接语法,它会产生编译器时间错误:connect(manager, &amp;QNetworkAccessManager::sslErrors, this, &amp;unifiedRequests::sslErrorHandler); 但我看不出您的连接有问题。另外,您是否尝试过在 QtCreator 调试器模式下运行(假设您使用的是 QtCreator)来找到崩溃的实际行? - 你能提供更多细节吗... 如果通过调用“unifiedRequests requestObj;”创建unifiedRequests对象,当“requestObj”变量超出范围时,该对象将被删除。这可能是你的问题。尝试通过调用“unifiedRequests* requestObj = new UnifiedRequests();”来创建您的统一请求对象。如果它解决了你的问题,你需要调用“delete requestObj;”在某个地方摧毁这个物体。何时何地取决于您的应用程序。 崩溃是内存访问错误,如帖子主题中所述。连接的新语法更加清晰,谢谢。 @Aurelien:就是这样! :) 你能解释一下为什么这有效而另一个无效吗?非常感谢! @Sanchit :我已将此作为答案发布 【参考方案1】:

您通过调用“unifiedRequests requestObj;”创建unifiedRequests对象,当“requestObj”变量超出范围时,该对象将被删除。

所以,当接收到信号时,对象就已经被销毁了。

尝试通过调用“unifiedRequests* requestObj = new UnifiedRequests();”来创建您的统一请求对象。

当然,你需要调用“delete requestObj;”在某个地方摧毁这个物体。何时何地取决于您的应用程序(当您不再需要此对象时)。

要了解区别,请看这里:http://www.tutorialspoint.com/cplusplus/cpp_dynamic_memory.htm

或谷歌“C++ 堆/堆栈/动态分配”

【讨论】:

或者只是使用QSharedPointer...在黑暗中刺穿这个“答案”,是吗?您还没有足够的信息-您可能是对的-但请不要将建议作为答案发布,只需添加评论即可。如果事实证明是正确的,请将其作为答案发布....如果是,我将投票:) @code_fodder Aurelian 对问题添加了评论,我确认这是在他们将其作为答案之前:)

以上是关于使用 QNetworkManager 时出现内存访问错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 Firebase 时出现内存不足错误

调用 [playerFactory play] 方法时出现错误访问错误

使用 sklearn 特征提取时出现内存错误

使用共享内存时出现分段错误

尝试使用 Gridsearchcv 时出现内存错误

使用 OpenCV (2.4.5) 时出现内存异常