Forum Clubic

[c++] question sur les destructeurs

salut

je me pose des questions sur les destructeur, je viens de voir que ça marche bizzarrement (ou ça bug grave, je sais pas trop …)
bref
imaginons, qu’on a cune class objet
alors on fait

[cpp]objet o;
delete &o;[/cpp]

là ça doit planter obligatoirement, non?
pasque le fait est que pour certain objet, ça plante pas forcément, pour un int par ex, il le détruit pas du tout

ce qui me pose le pb suivant : ds les destructeurs de mes classe, je suis supposé mettre quoi?
reprenons l’exemple:

class objet{
private :
int i;
date d; // date étant une classe (de 3 int)
public
objet();
~objet() { delete d;} /*pour le moment, je fais ça, mais maintenant, je serais tenté de ne plus rien mettre, puisque quand je déclare un objet c’est le system qui alloue l’espace pour d et le récupère */
}

l’idée c de mettre des delete juste là ou je fais des allocations dynamiques

en fait je voudrais juste qu’on me dise si j’ai bon (ou pas bon)

et accessoirement, savoir pourquoi ça plante pas là où ça devrait

merci
++

Exactement, le destructeur est appelé automatiquement pour le class non alloué dynamiquement. Tu peux faire des test en rajoutant de affichages de debug dans les destructeurs, c’est le mieu pour voir comment ca marche.

Dans un destructeur tu peux/dois y mettre des algo/fonctions/… te permettant de libérer les resources que tu as utilisé.
Par exemple :

  • Tu as un objet qui gère une base de données, dans le destructeur tu dois mettre la séquence d’instruction permettant de clore la connection à ta base.
  • Tu alloue dynamiquement de l’espace mémoire ( avec des new) tu dois le libérer des que tu n’en a plus besoin et donc le mieux/plus propre c’est de la libérer dans ton destructeurs.

Toutes les variables autres que des pointeurs ont une taille connues fixe et connus par le compilo donc c’est lui qui se débrouille pour libérer la mémoire.

Perso par exemple pour une classe Maillage je fais:

[cpp]class Maillage{
private:
int n;
int m;
float* myMaillage;

public:
// Constructeur
Maillage(int n, int m){
this->n = n; this->m = m
this->myMaillage = (float*)calloc(n*m, sizeof(float));
// Destructeur
~Maillage(){ free(myMaillage); }
// Méthodes et fonctions diverses

}[/cpp]

et dans mon programme utilisant cette classe je fais:

[cpp]…
int n,m;
Maillage *mai = new Maillage(n,m);

delete(mai);
…[/cpp]

:kimouss:

immonde le code :confused:
[cpp]
Maillage(int n, int m){
this->n = n; this->m = m
this->myMaillage = (float*)calloc(n*m, sizeof(float));
}
~Maillage(){ free(myMaillage); }
[/cpp]

a remplacer en :
[cpp]
Maillage(int n, int m):
n(n), m(m)
{
this->myMaillage = new float[n*m];
}
~Maillage(){ delete[] myMaillage; }
[/cpp]

[cpp]
Maillage(int n, int m):
n(n), m(m)
[/cpp]

Ca aussi c’est pas tres jolie, generalement on utilise ca plustot pour des class aggrégés a fin d’eviter d’appeler inutilement le constructeur par defaut et de lui assigne apres une valeur.

Tout a fait d’accord pour new a la place de malloc :
malloc n’appel pas le constructeur de la class.

Je rajouterais que c’est une source a BUG de nommer les parametres du meme nom qu’un membre de la class.

Je comprends pas trés bien la.

Tout a fait d’accord.

Ouais on peut aussi faire un truc du genre ~n:n (ou n:~n je ne sais plus), mais ce n’est pas le sujet, j’ai mis un code basique pour ne pas embrouiller, de plus je suis un peu novice en C++, je n’ai pas fait grand chose encore.
NB: pour le new float[n*m] est-ce que comme le calloc le tableau est initialisé à 0 ou est-ce que comme le malloc il alloue juste la mémoire en la laissant telle qu’elle ? Merci.
:kimouss:

le new n’initialise pas à 0.

Parcontre tu peux utiliser les std:vector qui euh on un constructeur qui permet de mettre une valeur.