2013-08-26 39 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();','同样的事情发生......所以,我不应该担心这个泄漏?整个事情是,视觉检漏仪犯了错误或什么?对不起,我过分的愚蠢。 –