c++ - QThread Memory Leak -


main.cpp:

#include <qcoreapplication> #include <qtcore> #include "myobject.h"  qthread* cthread; myobject* cobject;  int main(int argc, char *argv[]) {     qcoreapplication a(argc, argv);     cthread = new qthread();     cobject = new myobject();     cobject->movetothread(cthread);      qobject::connect(cthread, signal(started()),                      cobject, slot(dowork()));      qobject::connect(cthread, signal(finished()),                      cthread, slot(deletelater()));      qobject::connect(cthread, signal(finished()),                      cobject, slot(deletelater()));      cthread->start();      return a.exec(); } 

myobject.cpp:

#include "myobject.h"  myobject::myobject(qobject *parent) :     qobject(parent) { }  void myobject::dowork() {     qdebug() << "hi";     qthread::currentthread()->quit();     return; } 

myobject.h:

#ifndef myobject_h #define myobject_h  #include <qtcore>  class myobject : public qobject {     q_object public:     explicit myobject(qobject *parent = 0);  signals:  public slots:     void dowork();  };  #endif // myobject_h 

apparently, according to: https://stackoverflow.com/a/16062717, there memory leak, how fix it? guess have return event loop , call quit? issue don't have access event loop.

there isn't memory leak. qt clean if stick object model, , object trees , ownership. following documented examples.

here example referenced, observation added on deletelater().

main.cpp

#include <qcoreapplication> #include <qtcore> #include <qthread>  class mythread : public qthread {     q_object public slots:     void deletelater()     {         qdebug() << q_func_info;         qthread::deletelater();     } };   class myobject : public qobject {     q_object public:     explicit myobject(qobject *parent = 0){}  signals:  public slots:     void deletelater()     {         qdebug() << q_func_info;         qobject::deletelater();     }      void dowork()     {         qdebug() << "hi";         qthread::currentthread()->quit(); // supposed stop here, doesn't.         return;         (int = 0; < 1000000; i++) {             qdebug() << i;         }     }  };  qthread* cthread; myobject* cobject;  int main(int argc, char *argv[]) {     qcoreapplication a(argc, argv);     cthread = new mythread();     cobject = new myobject();     cobject->movetothread(cthread);      qobject::connect(cthread, signal(started()),                      cobject, slot(dowork()));      qobject::connect(cthread, signal(finished()),                      cthread, slot(deletelater()));      qobject::connect(cthread, signal(finished()),                      cobject, slot(deletelater()));      cthread->start();      return a.exec(); } 

output:

hi void __thiscall myobject::deletelater(void) void __thiscall mythread::deletelater(void) 

hope helps.


Comments

Popular posts from this blog

c# - Send Image in Json : 400 Bad request -

jquery - Fancybox - apply a function to several elements -

An easy way to program an Android keyboard layout app -