[QTreeView] Fuite mémoire avec setModel() ?
Bonjour,
J'ai développé une application inspirée de l'exemple "simpletreemodel".
Observée depuis le gestionnaire de tâches, cette application, en termes de mémoire, fuit.
La différence principale, relativement à l'exemple cité, est que les appels à la fonction membre "setModel(...) " de QTreeView sont récurrents.
J'ai donc repris l'exemple "simpletreemodel" et ai modifié le fichier "main.cpp" afin de mettre en évidence le problème évoqué.
En voici le code:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| #include <QtGui>
#include "treemodel.h"
TreeModel * model = 0;
QTreeView * view = 0;
class QObject;
class QEvent;
class Application : public QApplication
{
private:
int m_timerId;
public:
Application(int argc, char * argv[]);
bool notify(QObject * receiver, QEvent * event);
void timerId(int value);
void timerEvent(QTimerEvent * event);
};
Application::Application(int argc, char * argv[])
: QApplication(argc, argv)
{
connect(this, SIGNAL(destroyed()), this, SLOT(quit()));
}
bool Application::notify(QObject * receiver, QEvent * event)
{
if (receiver == this)
{
if (event->type() == QEvent::Quit)
{
if (model)
delete model;
if (view)
delete view;
}
if (event->type() == QEvent::Timer)
killTimer(m_timerId);
}
return QApplication::notify(receiver, event);
}
void Application::timerId(int value)
{
m_timerId = value;
}
void Application::timerEvent(QTimerEvent * event)
{
if (view)
{
if (model)
delete model;
QFile file(":/default.txt");
file.open(QIODevice::ReadOnly);
model = new TreeModel(file.readAll());
file.close();
view->setModel(model);
view->show();
}
}
int main(int argc, char *argv[])
{
Q_INIT_RESOURCE(simpletreemodel);
Application app(argc, argv);
QFile file(":/default.txt");
file.open(QIODevice::ReadOnly);
model = new TreeModel(file.readAll());
file.close();
view = new QTreeView();
view->setWindowTitle(QObject::tr("Simple Tree Model"));
app.startTimer(100);
view->setModel(model);
view->show();
return app.exec();
} |
La ligne en cause est en rouge.
Il suffit de mettre cette ligne en commentaire pour que l'application ne "fuit" plus.
Auriez-vous une explication ?
Voire une solution que me permettrait d'actualiser la vue en évitant cet écueil.
Merci d'avance.
Cordialement.
Bug reporté sur JIRA Qt Nokia
Bonjour,
Comme moi, vous séchez. :cry:
J'ai reporté le bug sur JIRA Qt Nokia. :ccool:
Classifié comme bug important.:oops:
Je vous informerai de leur réponse. :cfou:
Dans le doute, à ceux qui utilisent QtTreeView, soyez prudent.
Cordialement.
Bug suivi par JIRA Qt Nokia
A tous,
Je n'ai pas de retour d'information relativement à ce bug.
Cela, bien évidemment hypothèque lourdement la recette de mon applicatif.
Pour ceux qui serait en attente, voici le lien succeptible de fournir, à terme, une solution.
http://bugreports.qt.nokia.com/browse/QTBUG-11508
Bien cordialement.