2013-08-26 40 views
0

我有一個簡單的類:如何解決從QObject繼承的內存泄漏問題?

class HttpClient : public QObject 
{ 

    Q_OBJECT 
public: 

    QNetworkAccessManager* manager; 
    QNetworkReply* reply; 

    HttpClient(){ 
     manager = new QNetworkAccessManager(); 
     reply = nullptr; 
    } 
    ~HttpClient(){ 
     delete reply; 
    } 

    public slots: 
     void slotReadyRead(){ 
      cout << reply->readAll().data() << endl; 
     } 
     void slotNetworkError(QNetworkReply::NetworkError error){ 
      cout << reply->error() << endl; 
     } 
public: 
    void Get(QUrl url){ 

     QNetworkRequest request; 
     request.setUrl(url); 

     reply = manager->get(request); 
     connect(reply, SIGNAL(finished()), this, SLOT(slotReadyRead())); 
     connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(slotNetworkError(QNetworkReply::NetworkError))); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    HttpClient client; 
    client.Get(QUrl("http://localhost/SomeWebService.svc/GetData")); 

    return a.exec(); 
} 

視覺檢漏儀指向的內存泄漏在這一點上:

manager = new QNetworkAccessManager(this); 

如何解決呢?我並不堅持認爲這是最好的解決方案,但我只是從QT開始,我不明白爲什麼我在這裏泄漏內存。

+0

也許'QNetworkAccessManager'分配一些靜態的數據? –

+0

代碼很好。這是誤報。 –

+0

「HttpClient」本身是否被銷燬? –

回答

0

我猜你是無法撥打:

delete manager? 
+0

那有什麼問題?我應該如何重寫析構函數? –

+0

@David Elliman,當你用'this'實例化它們時,不要在析構函數中刪除QObject。 – Greenflow

+0

但我泄漏後沒有消失'/ /刪除管理器;' –

1

這是因爲您通過「本」,以

http://qt-project.org/doc/qt-4.8/qnetworkaccessmanager.html#QNetworkAccessManager

和所有權通過父對象的指針,爲此Qt的記憶模型將負責刪除對象,請參閱

http://qt-project.org/doc/qt-4.8/objecttrees.html

此外,檢查出

Memory management in Qt?

+0

如果我不傳遞任何東西'manager = new QNetworkAccessManager();','同樣的事情發生......所以,我不應該擔心這個泄漏?整個事情是,視覺檢漏儀犯了錯誤或什麼?對不起,我過分的愚蠢。 –