2016-06-23 7 views
0

QT는 물론 C++에 대한 새로운 경험이 있습니다. 사용자가 버튼을 클릭 할 때 웹 사이트에 POST하는 프로그램을 만들려고하지만 QNetworkManager에 액세스하려고 할 때마다 메모리 액세스 오류가 발생합니다. 내 요청 개체에 대한
코드는 (중요한 비트를 보여주기 위해 약간 손질) 다음과 같습니다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 개체를 만드는거야 호출하여 : 다른 파일에

unifiedRequests requestObj; 

. SSL을 끄려는 줄에서 충돌이 발생합니다 (자체 서명 된 인증서를 사용하고 있으므로 요청을하기 위해이 작업을 수행해야합니다). 이견있는 사람?
감사합니다.

+0

에 대한 구글 :

은 이쪽을 봐, 차이를 이해하려면? – IAmInPLS

+0

connect() 문의 충돌이 발생 했습니까? 컴파일러 시간 오류를 제공하는 새로운 연결 구문을 시도해 볼 수 있습니다 :'connect (manager, & QNetworkAccessManager :: sslErrors, this, & unifiedRequests :: sslErrorHandler); '하지만 연결에 문제가 없습니다. 또한 QtCreator 디버거 모드로 실행 해 보았습니다 (QtCreator를 사용한다고 가정).이 충돌이 발생한 실제 행을 찾으십니까? - 자세한 내용을 제공 할 수 있습니까? –

+1

"unifiedRequests requestObj;"를 호출하여 unifiedRequests 객체를 만드는 경우 변수 "requestObj"가 범위를 벗어날 때이 객체가 삭제됩니다. 여기에 문제가있을 수 있습니다. "unifiedRequests * requestObj = new unifiedRequests();"를 호출하여 unifiedRequests 개체를 만들어보세요. 문제가 해결되면 "delete requestObj;"를 호출해야합니다. 이 객체를 파괴 할 수있는 곳. 언제 어디서나 귀하의 신청서에 의존하십시오. – Aurelien

답변

2

"unifiedRequests requestObj;"를 호출하여 unifiedRequests 객체를 만들면 변수 "requestObj"가 범위를 벗어날 때이 객체가 삭제됩니다.

신호가 수신되면 개체가 이미 파괴됩니다.

"unifiedRequests * requestObj = new unifiedRequests();"를 호출하여 unifiedRequests 객체를 만들어보십시오.

물론 "delete requestObj"를 호출해야합니다. 이 객체를 파괴 할 수있는 곳. 언제 어디서나 응용 프로그램에 의존합니다 (이 객체가 더 이상 필요하지 않을 때). http://www.tutorialspoint.com/cplusplus/cpp_dynamic_memory.htm

또는 "C++ 힙/스택/동적 할당"당신은 무엇을 의미합니까 "그것은 충돌"

+0

아니면 "QSharedPointer"를 사용하십시오 ... 어둠 속에서 찌르는듯한 비트가이 "대답"입니까? 당신은 아직 충분한 정보가 없습니다 - 당신이 옳을 수도 있지만 - 제안을 답변으로 게시하지 말고 그냥 코멘트를 추가하십시오. 올바른 것으로 판명되면 대답으로 게시하십시오 .... 만약 내가 그렇다면 투표 할 것입니다 :) –

+0

@code_fodder 전 :-) – Aurelien

+0

잘 했으니 약속대로 +1하십시오! :) –

관련 문제