Delete avec Qt
Résolu
twiiiix
Messages postés
325
Date d'inscription
Statut
Membre
Dernière intervention
-
twiiiix Messages postés 325 Date d'inscription Statut Membre Dernière intervention -
twiiiix Messages postés 325 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je programme avec Qt, et j'ai du mal à savoir quand il faut désallouer un objet alloué dynamiquement. Quelqu'un peut-il me dire dans quel cas Qt désalloue automatiquement et dans quel cas il ne le fait pas. Si par exemple dans mon fichier Header je déclare un pointer sur un objet et que je l'initialise dans une méthode, l'objet sera-t-il désallouer si j'appelle
la méthode plusieurs fois ?
Merci d'avance.
Je programme avec Qt, et j'ai du mal à savoir quand il faut désallouer un objet alloué dynamiquement. Quelqu'un peut-il me dire dans quel cas Qt désalloue automatiquement et dans quel cas il ne le fait pas. Si par exemple dans mon fichier Header je déclare un pointer sur un objet et que je l'initialise dans une méthode, l'objet sera-t-il désallouer si j'appelle
la méthode plusieurs fois ?
Merci d'avance.
A voir également:
- Interrogation qt
- Point d'interrogation à l'envers - Forum Bureautique
- Point d'interrogation / d'exclamation à l'envers ✓ - Forum Word
- Word (point d'interrogation inversé) ✓ - Forum Word
- Qt sdk - Télécharger - Langages
- Point d'interrogation clavier - Forum Windows 8 / 8.1
2 réponses
La réponse est simple:
- le mécanisme de Qt est tel que lorsqu'un objet Qt est détruit tous ses enfants sont automatiquement détruits.
Lorsque l'on crée un widget X (par exemple un QDialog) et qu'à l'intérieur de celui-ci on crée des QLabel, des QTextEdit, des QWidget... qui ont tous pour parents ou grands-parents le fameux X, alors suite à l'appel de 'close()', X sera détruit ainsi que tous ses enfants et petits-enfants.
Sauf cas particuliers on ne détruit pas implicitement de widget.
Toutefois ceci ne s'applique qu'aux widgets de Qt; pour les autres objets les principes du C++ s'appliquent.
Bonne continuation.
- le mécanisme de Qt est tel que lorsqu'un objet Qt est détruit tous ses enfants sont automatiquement détruits.
Lorsque l'on crée un widget X (par exemple un QDialog) et qu'à l'intérieur de celui-ci on crée des QLabel, des QTextEdit, des QWidget... qui ont tous pour parents ou grands-parents le fameux X, alors suite à l'appel de 'close()', X sera détruit ainsi que tous ses enfants et petits-enfants.
Sauf cas particuliers on ne détruit pas implicitement de widget.
Toutefois ceci ne s'applique qu'aux widgets de Qt; pour les autres objets les principes du C++ s'appliquent.
Bonne continuation.
Ouhh la la je ne pensais pas engendrer tant d'interrogation !!!
Voici un exemple minimal qui met en lumière ce qui est et ce qui n'est pas détruit automatiquement par Qt, enfin j'espère (je ne mets que le code):
Bonne réflexion et si vous avez des questions...
Voici un exemple minimal qui met en lumière ce qui est et ce qui n'est pas détruit automatiquement par Qt, enfin j'espère (je ne mets que le code):
class FenPrincipale : public QMainWindow { Q_OBJECT public: FenPrincipale(QWidget* parent=0); ~FenPrincipale(); private: int entier; int* pentier; QString fileName; QLabel* label; QLineEdit* lineEdit; QPushButton* pushButton; }; FenPrincipale::FenPrincipale(QWidget *parent) : QMainWindow(parent) { entier = 100; pentier = new int; label = new QLabel("Exemple", this); label->setGeometry(10,10,100,25); lineEdit = new QLineEdit(this); lineEdit->setGeometry(10,40,100,25); pushButton = new QPushButton("close", this); pushButton->setGeometry(10,70,100,25); QObject::connect(pushButton, SIGNAL(clicked()), this, SLOT(close())); } FenPrincipale::~FenPrincipale() { delete pentier; } int main(int argc, char* argv[]) { QApplication app(argc, argv); FenPrincipale fenetre; fenetre.show(); return app.exec(); }Nota: 'close()' est une fonction (en fait un slot) défini pour tout objet dérivant de QWidget.
Bonne réflexion et si vous avez des questions...
Au fait, encore une question ^^, c'est un bout du code d'un de mes slot :
hauteur est déclaré dans le constructeur, text est aussi déclaré dans le constructeur(QString), table est aussi déclaré dans le constructeur (QTableWidget).
tableauDonnee fait la même taille que table, il est désalloué à la fin du slot car il n'est plus utile. Ce slot est appelé beaucoup de fois dans mon programme.
Les QTableWidgetItem seront-il désallouer à un moment donné ?
for(i= 0 ; i<hauteur ; i++) { for(y= 0 ; y<7 ; y++) { temp = new QTableWidgetItem ; text->setNum(tableauDonnee[i][y],'f',0); temp->setText(*text ); table->setItem(i,y,temp); } }
hauteur est déclaré dans le constructeur, text est aussi déclaré dans le constructeur(QString), table est aussi déclaré dans le constructeur (QTableWidget).
tableauDonnee fait la même taille que table, il est désalloué à la fin du slot car il n'est plus utile. Ce slot est appelé beaucoup de fois dans mon programme.
Les QTableWidgetItem seront-il désallouer à un moment donné ?
Oui les 'QTableWidgetItem seront désalloués au moment de la destruction de 'table' puisqu'en invoquant la fonction 'setItem', implicitement on donne 'table' comme parent de 'temp'.
Il est toutefois possible de récupérer ce QTableWidgetItem en l'enlevant de QTableWidget, par exemple avec la méthode 'takeItem', et dans ce cas il appartient au programmeur de gérer cet objet en le détruisant s'il n'en a plus besoin car le fait de le récupérer a supprimé la filiation (ce qui est fort logique).
Bonne réflexion.
Il est toutefois possible de récupérer ce QTableWidgetItem en l'enlevant de QTableWidget, par exemple avec la méthode 'takeItem', et dans ce cas il appartient au programmeur de gérer cet objet en le détruisant s'il n'en a plus besoin car le fait de le récupérer a supprimé la filiation (ce qui est fort logique).
Bonne réflexion.
Merci pour ces précisions loupius. Une dernière précision, delete agit donc comme close() ?
QWidget *a;
a=new...
...
delete a;
// équivaut à
a->close();
Juste une dernière question, lorsque j' ai besoin d'un nouvel objet dans une méthode, faut-il que je déclare son pointeur dans le H et que je l'initialise dans la méthode ou que je le crée tout simplement, si j'utilise la première solution sera-t-il désallouer automatiquement ?
j'imagine que tu doit avoir :
et