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
Post a Comment