2017-08-04 14 views
0

Eine Frage, über die Verwendung von QSharedPointer in folgendem Szenario auf QSharedPointer:Pass QNetworkReply Zeiger

Ich habe eine Klasse mit zwei QSharedPointer Privat Klasse Mitgliedern:

class xy{ 

... 

private: 
    QSharedPointer<QNetworkAccessManager> m_nam; 
    QSharedPointer<QNetworkReply>   m_nr; 
}; 

Im Code, den ich einen QNetworkAccessManager Post, Der Rückgabewert ist ein QNetworkReply Zeiger.

QNetworkReply * QNetworkAccessManager::post(const QNetworkRequest & request, const QByteArray & data) 

Ich möchte m_nr diesen Zeiger auf meine QSharedPointer das heißt passieren. Ich habe versucht:

m_nam.reset(new QNetworkAccessManager(m_parent.data())); 
QNetworkRequest request(url); 
... 
... 
// following line is my problem 
m_nr = QSharedPointer<QNetworkReply>(m_nam->post(request, postData)); 
... 

Aber abgestürzt ist, dann habe ich versucht:

m_nam.reset(new QNetworkAccessManager(m_parent.data())); 
QNetworkRequest request(url); 
... 
... 
// following line is my problem 
m_nr.reset(m_nam->post(request, postData)); 
... 

Aber auch abgestürzt.

Wie passiere ich QNetworkReply Zeiger richtig zu meinem QSharedPointer?

+0

Bitte geben Sie ein minimales, vollständiges und überprüfbares Beispiel an. https://StackOverflow.com/Help/Mcve – hank

+0

Sollte genug Beispiel Code sein, denke ich – user3728686

Antwort

0

Was ist der Fehler beim Absturz ?? Stürzt es genau an der von Ihnen erwähnten Linie ab.

Seien Sie vorsichtig in Qt, um Smart Pointer und QObjects Parenting zu kombinieren. Parenting in Qt beeinflusst das Freigeben von Objekten mit einer Art von Pseudo-Speicherbereinigung. Alle untergeordneten Elemente eines gelöschten QObject werden ebenfalls gelöscht. Wenn Sie dies beispielsweise mit QSharedPointer kombinieren, kann dies dazu führen, dass mehrere Objekte frei sind oder Sie nach freien Problemen auf sie zugreifen können.

+0

Ja, es stürzt genau an dieser Linie ich erwähnte. Für den Moment verwende ich nicht Smart Pointer, sondern QNetworkReply Pointer stattdessen, um das Ergebnis von "m_nam-> post()" zu übergeben. Weil momentan keine Zeit ist. Ich werde später mit diesem Thema fortfahren ... – user3728686

Verwandte Themen