Bonjour.

Je me mets doucement à Qt, et j'aurai plusieurs questions relatives aux pointeurs et aux classes. En effet, on trouve plusieurs types de déclarations et je voudrais être certain de bien comprendre. Pour cela, je prendrais des exemples avec une "QString _chaine"


1) Sans pointeurs

Tout d'abord la méthode pour définir des variables membres classiques :
Déclaration dans le header du type :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
private :
QString _chaine
La _chaine est vraiment "membre" de la classe, elle est déclarée à la création de la classe et est détruite à la destruction de celle-ci. Dans n'importe quelles fonction membre de la classe je peux faire appel à _chaine et exécuter des fonctions du type


2) Avec pointeurs

Maintenant, je peux décider de passer par des pointeurs et c'est apparemment ce qu'il est courant d'utiliser avec Qt.
Déclaration dans le header :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
private :
QString *_chaine
Ensuite, il faut obligatoirement passer par des allocation/désallocation de mémoire dans les fonctions membres de la classe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
_chaine = new QString
delete chaine
Avec cette méthode j'ai plusieurs questions :
2-1) L'allocation doit-elle se faire obligatoirement dans le constructeur de la classe et la désallocation dans le destructeur ? Ce que je veux dire par là c'est "la pratique d'une programmation "propre" veut-elle que lorsqu'une variable membre est déclarée en tant que pointeur on l'initialise dans le constructeur et on la delete dans le destructeur " ?
2-2) Si on ne delete pas le pointeur dans le destructeur que se passe-t-il concrètement ?
2-3) Si la réponse a la première question est "non" alors cela signifie que l'on peut très bien avoir des "_chaine = new QString" dans plusieurs fonctions membres de la classe : n'est-ce pas un peu la pagaille du coup au niveau de l'allocation/désallocation ?


3) Avec pointeurs, autre version

3ème syntaxe, que j'avoue avoir un peu du mal à comprendre à quoi elle sert et quelle sont les subtilités. Il s'agit de la syntaxe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
QString *_chaine = new QString ("Bonjour")
3-1) Dans ce cas là il s'agit à la fois de la déclaration du pointeur et de l'allocation en mémoire c'est çà ?
3-2) Si j'ai bien compris ce type de syntaxe permet de définir non pas des variables membres, mais des variables locales à certaines fonctions membres d'une classe. Et c'est là que cela devient plus difficile à comprendre pour moi : que se passe-t-il si l'on ne fait pas de "delete _chaine" à la fin de l'exécution de la fonction membre ? La variable locale est-elle automatiquement détruite à la fin de l'exécution de la fonction membre ?
Merci de m'éclairer sur ce point.


En tous les cas si vous avez des éclaircissements à m'apporter je suis preneur