Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Destructeurs et pointeurs [ Divers / Débutant(e) ] (Sk8yo)

jeudi 24 août 2006 à 20:07:32 | Destructeurs et pointeurs

Sk8yo

Bonsoir ami(e)s devellopeur(se),

je rencontre quelques petit probleme quand a la destruction de mes objets.

j'ai trois classes A, B et C decritent ci dessous:

classA{
  public:
    A(){ tableau=newint[nb];}
    ~A()
  private:
    int* tableau;
};

classB{
  public:
    B(){ tableau=new A*[nb];}
    ~B()
  private:
    A**  tableau;
};

classC{
  public:
    C() { tableau=new B*[nb];}
    ~C()
  private:
    B** tableau;
};

A possede un tableau d'entier;
B possede un tableau de pointeur pointant sur des objet de type A
C possede un tableau de pointeur pointant sur des objet de type B

la création et la manipulation des mes objet se fait sans probleme celon mes souhaits.
cependant la destruction pose probleme;
j'ai essayé plein de façon differentes (en desespoir de cause) mais pas moyen de les detruire
en effet j ai une partie de mon programme qui resemble a ceci:

for(int i=0;i<NB;i++){
    C* toto=new C();
    for(int j=0;j<NB;j++){
        C* tata=newC();
        if(toto->fonction(tata)){
            //traitement
            delete tata;
            break;
        }
        delete tata;
    }
    delete toto;
}

le but de ce code est de conparer 2 à 2 tous les element d'un même ensemble (en s'arrétant au premier element répondant vrai au test (break) )
NB peut etre tres grand et donc comme je crée des objets a la volée il faut que je les detruise des que je n'en est plus besoins
sous peine de voir ma memoire saturée vitesse grand V;
et donc bien entendu je n'arrive pas a les detruires correctemnt ;

donc si quelqu un avait des destructeurs libérant bien la memoire aloué lors de la création de C (entrainant celles de B entrainant celles de A)  cela me sauverrai la vie!

merci a vous si vous avez deja pris la peine de lire ce post.





jeudi 24 août 2006 à 20:27:56 | Re : Destructeurs et pointeurs

luhtor

Mais c'est très simple, suffit d'isoler chaque classe et de détruire ce qu'elle a créée:

classA{
  public:
    A(){ tableau=newint[nb];}
    ~A(){ delete[] tableau; }
  private:
    int* tableau;
};

classB{
  public:
    B(){ tableau=new A*[nb];}
    ~B() { delete[] tableau; }
  private:
    A**  tableau;
};

classC{
  public:
    C() { tableau=new B*[nb];}
    ~C() { delete[] tableau; }
  private:
    B** tableau;
};

Quand tu créés un tableau de pointeur de B,  aucu object B n'est créé.

En fait, je crois que j'ai pas bien compris. Si toi tu initialises les pointeurs des tableaux que tu créés (et non la classe), c'est a toi de les détruire, pas a la classe.

jeudi 24 août 2006 à 22:01:41 | Re : Destructeurs et pointeurs

Sk8yo

class C {
  public:
    C() { tableau=new B*[nb];}
    ~C() { delete[] tableau; }
  private:
    B** tableau;
};


une fois le tableau du pointeur créé je crée mes objet B dans ma classe C

tableau[i]=new B(/*divers parametres*/)
 
est ce que delete [] tableau appellera le destructeur de mes B ou est ce que je doit les detruires
avec un destructeur du genre:

~C(){
    for(int i=0;i<nb;i++){
        delete tableau[i];
    }
    delete [] tableau;
}

??

jeudi 24 août 2006 à 22:24:13 | Re : Destructeurs et pointeurs

Hylvenir

C'est le but de delete[] d'appeler les destructeurs des objets du tableau alloué
par new ..[]
Tu n'as donc rien à faire que ce que t'as donné luthor.
( bon il rester les bugs de copie et d'assignation mais tu le découvriras plus tard ;) )


jeudi 24 août 2006 à 23:45:10 | Re : Destructeurs et pointeurs

luhtor

~C(){
    for(int i=0;i<nb;i++){
        delete tableau[i];
    }
    delete [] tableau;
}

NON ! :) car ce n'est pas la classe qui a créer les objets B de ta classe C. la classe  C n'a fait que créer un tableau de pointeur, donc ne détruit que ce tableau. Donc QUESTION: qui a créer les pointeurs du tableau ?

"est ce que delete [] tableau appellera le destructeur de mes B ou est ce que je doit les detruires
avec un destructeur du genre:" => surement pas, delete[] détruit le tableau de pointeur, mais pas les objets pointés par les pointeurs du tableau.

Pour vérifier que tous tes objets sont bien détruits, tu peux surchargé les opérateurs (mais c'est compliqué) ou deuxième solution très simple, tu ajoutes un compteurs static dans chaque classe:

classA{
  public:
    A(){ tableau=newint[nb]; reference_counter++; }
    ~A() { delete[] tableau; reference_counter--; }
  private:
    int* tableau;

static unsigned int reference_counter;
};

unsigned int A::reference_counter = 0;

Par contre, j'espère que tu n'utilise pas le constructeur de copie. Suffit de vérifier avant la fermeture du programme que (A::reference_counter == 0), auquel cas tous les objets ont bien été détruits.



vendredi 25 août 2006 à 14:45:19 | Re : Destructeurs et pointeurs

Sk8yo

Un ENORME MERCI à vous!!!
pendant que je tapais une autre question pour j'ai trouver d'ou venait ma fuite memoire.

encore 10000*merci;



vendredi 25 août 2006 à 21:43:16 | Re : Destructeurs et pointeurs

Hylvenir

oups, en effet, luthor, je me suis laissé aller.
delete[] appelle en effet les destructeurs des éléments du tableau (contrairement à malloc) mais le tableau contient des pointeurs, et le destruceur des pointeurs ne va pas appeler le destructeur des objets.

Fallait dormir plus tôt




Cette discussion est classé dans : probleme, tableau, nb, tata, destructeurs


Répondre à ce message

Sujets en rapport avec ce message

probleme de tableau avec Dev c++ [ par D4rkRe4per ] Hello tlm!g un leger probleme de tableau avec Dev c++ 4.Dans mon fichier source j'ecris : const char pr[] = {"A", "Acca", "Agla", "Agra", "An", "Anc( [C] lignes d'un fichier dans un tableau : Segmentation fault [ par Michel76 ] Bonjour,Pardonnez-moi de cette question de débutant.Soit un fichier contenant :-----001002-----Je souhaiterais mettre chacune des lignes de ce fichier tableau d'une classe... [ par jonathan100 ] Bonjour a tous, Voici mon problème. J'ai une classe Voiture, et une classe table qui contient un tableau de Voiture. Voici le code de la classe table, Probleme de tableau entre C et C++ [ par fred23 ] Bonjour,J'ai récupéré des codes qui semblent en C et je souahiterais les mettre en C++.qui peut me dire si ces codes sont en C ou C++.Matrix = (int ** Probleme de caractere dans un tableau [ par byoushin ] Bonjour,J'ai un tableau a 2 dimensions qui ressemble a ca :0 1 2 3 4 5 6 7 8 91 0 0 0 0 0 0 0 0 02 0 0 0 0 0 0 0 0 03 0 0 0 0 0 0 0 0 04 0 0 0 0 remplir un tableau bidimensionnel alatroirement [ par titchouno ] En fait je cree un tableau [X][X] que je rempli de zero.Mon probleme est de mettre X 1 aleatoirement dans ce tableau. j utilise deux varaibles aleato gros probleme sur tetris [ par popil ] je fais un tetris avec interface graphique en opengl.je fai un tableau pour reperer les pieces qui sont deja tombees.j'arrive a limiter les mouvements Probleme de tableau [ par manta7 ] Bonjour, j'ai un petit problème avec la compilationde ce code : int *t; t = malloc(B * sizeof (int)); Je suis sous Microsoft Visual C++ 6 mais je pr [C] Probleme de passage d'un pointeur de tableau [ par tenev911 ] Bonjour, voici mon probleme :J'utilise la librairie ncurses.h et il permet de faire un type de variable appellé WINDOW (qui correspond graphiquement à probleme entre chaine et tableau [ par Elkaire ] salut a tous, je debute en C et je me retrouve confrontéau probleme suivant : dans une mon application cllient serveur mon client envoie des trames so


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,437 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.