使用QNetworkManager时内存访问错误 我对C++是相当新的(虽然我有C的一些经验)以及Qt。我正在尝试制作一个程序,当用户单击按钮时,该程序将发布到网站,但每当我尝试访问QNetworkManager时,就会出现内存访问错误。 我的请求对象的代码如下(略微修剪以显示重要的位):

使用QNetworkManager时内存访问错误 我对C++是相当新的(虽然我有C的一些经验)以及Qt。我正在尝试制作一个程序,当用户单击按钮时,该程序将发布到网站,但每当我尝试访问QNetworkManager时,就会出现内存访问错误。 我的请求对象的代码如下(略微修剪以显示重要的位):,c++,qt,qnetworkaccessmanager,C++,Qt,Qnetworkaccessmanager,在另一个文件中。它在我试图关闭SSL的线路上崩溃(我们使用的是自签名证书,所以我需要这样做才能发出请求)。有什么想法吗? 谢谢大家! 通过调用“unifiedRequests requestObj;”创建unifiedRequests对象,当变量“requestObj”超出范围时,此对象将被删除 因此,当接收到信号时,物体将被摧毁 尝试通过调用“unifiedRequests*requestObj=new unifiedRequests();”来创建unifiedRequests对象 当然,您需

在另一个文件中。它在我试图关闭SSL的线路上崩溃(我们使用的是自签名证书,所以我需要这样做才能发出请求)。有什么想法吗?

谢谢大家!

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

因此,当接收到信号时,物体将被摧毁

尝试通过调用“unifiedRequests*requestObj=new unifiedRequests();”来创建unifiedRequests对象

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

要了解差异,请查看以下内容:


或google for“C++堆/堆栈/动态分配”

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

因此,当接收到信号时,物体将被摧毁

尝试通过调用“unifiedRequests*requestObj=new unifiedRequests();”来创建unifiedRequests对象

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

要了解差异,请查看以下内容:


或者用谷歌搜索“C++堆/堆栈/动态分配”

你说的“it崩溃”是什么意思?你是说在你的connect()语句中它崩溃了吗?您可以尝试出现编译器时间错误的较新连接语法:
connect(manager,&QNetworkAccessManager::sslErrors,this,&unifiedRequests::sslErrorHandler)但我看不出你的连接有问题。另外,您是否尝试过在QtCreator调试器模式下运行(假设您正在使用QtCreator)以查找此崩溃的实际行?-能否提供更多详细信息…如果通过调用“unifiedRequests requestObj;”创建unifiedRequests对象,当变量“requestObj”超出范围时,此对象将被删除。这可能是你的问题。尝试通过调用“unifiedRequests*requestObj=new unifiedRequests();”来创建unifiedRequests对象。如果它解决了您的问题,您需要在某个地方调用“delete requestObj;”来销毁此对象。何时何地取决于您的应用程序。崩溃是一个内存访问错误,如本文主题所述。connect的新语法更加清晰,谢谢@奥雷林:就是这样!:)你能解释一下为什么这个有效而另一个无效吗?非常感谢你@Sanchit:我把这个贴出来作为一个答案,你说“it崩溃”是什么意思?你是说在你的connect()语句中它崩溃了吗?您可以尝试出现编译器时间错误的较新连接语法:
connect(manager,&QNetworkAccessManager::sslErrors,this,&unifiedRequests::sslErrorHandler)但我看不出你的连接有问题。另外,您是否尝试过在QtCreator调试器模式下运行(假设您正在使用QtCreator)以查找此崩溃的实际行?-能否提供更多详细信息…如果通过调用“unifiedRequests requestObj;”创建unifiedRequests对象,当变量“requestObj”超出范围时,此对象将被删除。这可能是你的问题。尝试通过调用“unifiedRequests*requestObj=new unifiedRequests();”来创建unifiedRequests对象。如果它解决了您的问题,您需要在某个地方调用“delete requestObj;”来销毁此对象。何时何地取决于您的应用程序。崩溃是一个内存访问错误,如本文主题所述。connect的新语法更加清晰,谢谢@奥雷林:就是这样!:)你能解释一下为什么这个有效而另一个无效吗?非常感谢你@Sanchit:我已经发布了这个作为回答,或者只是使用
QSharedPointer
。。。这个“答案”有点像暗箭伤人,是吗?你还没有足够的信息-可能你是对的-但请不要将建议作为答案发布,只需添加评论即可。如果结果是正确的,那么就把它作为答案贴出来。。。。如果是的话,我会投赞成票:)@code\u fodder Aurelian在问题上添加了一条评论,我在他们回答这个问题之前确认了这一点:)或者只使用
QSharedPointer
。。。这个“答案”有点像暗箭伤人,是吗?你还没有足够的信息-可能你是对的-但请不要将建议作为答案发布,只需添加评论即可。如果结果是正确的,那么就把它作为答案贴出来。。。。如果是的话,我会投赞成票:)@code\u fodder Aurelian在问题上添加了一条评论,我在他们回答这个问题之前确认了这一点:)
#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;