IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

[Debutant] Destructeur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 65
    Par défaut [Debutant] Destructeur
    Bonjour,

    Voila mon probleme :

    J'ai une classe avec comme attributs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int ordre;
    // tableau la matrice
    double long **tab;
    Je suppose, vu que j'utilise de l'allocation dynamique, que je dois faire un destructeur mais j'avoue je sais pas trop comment....

    J'ai essayé dans mon destructeur de mettre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for (int i=0;i<ordre;i++)
    { 
    			delete [] tab[i]; 
     
    }
    delete [] tab;
    Mais ça merde kan mon tab est vide...Je sais pas trop koi faire.

    Merci d'avance pour votre aide...

  2. #2
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut Re: [Debutant] Destructeur
    salut,

    il suffit de tester si le pointeur est valide ou non avant de tenter de détruire quelque chose qui n'existe peut-être pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (tab)
    {
       for (int i=0;i<ordre;i++)
          delete [] tab[i]; 
     
       delete [] tab; 
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 65
    Par défaut
    Bonjour, d'abord merci pour ta réponse...

    Je viens d'essayer ce que tu m'as donné et ça ne marche pas.....
    J'ai droit a un beau message d'erreur du genre :


    "Unhandled exception at 0x10252758 in MatriceBlooVisual.exe: 0xC0000005: Access violation reading location 0xccccccc0."

    à la ligne "delete [] tab;"

    quand mes tableaux ne sont pas alloués...et un truc pire quand mes tableaux sont alloués...

    Voila le code de l'allocation dasn le constructeur si ca peut aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     tab = new double long * [ordre];  // on détermine un tableau de 'ordre' pointeurs de type double long
    for (int i=0;i<=ordre;i++)
    {
         tab[i]= new double long[ordre+1];  // on détermine un tableau de 'ordre' double long pour chaque pointeur précédent
    }
    Donc voila je suis un peu perplexe...

    J'ai essayé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // désallouer tout ce qui a été alloué 
    for ( int i = 0; i < ordre; ++i ) 
    {
         delete [] tab[ i ];
    }
    tab = NULL;
    delete [] tab;
    et ça a l'air de marcher mais je sais pas si ça libere correctement la memoire....

  4. #4
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // désallouer tout ce qui a été alloué 
    for ( int i = 0; i < ordre; ++i ) 
    {
         delete [] tab[ i ];
    }
    tab = NULL;
    delete [] tab;
    tab = NULL;
    delete [] tab;

    ça ne désalloue rien du tout là. en faisant tab = NULL, tu perds l'adresse vers la zone mémoire à désallouer (donc fuite de mémoire puisque tu ne pourras pas désallouer cette zone, n'ayant plus de pointeur vers elle).

    sinon je ne peux rien tester là, n'ayant pas de compilo sous la main. désolé.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 65
    Par défaut
    Oui c'est ce qui me semblait, que je supprimais qu'une partie....
    Bon je vais continué de chercher. Pour info, j'utilise Visual C++ 2005.
    Merci de ton aide...

  6. #6
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    ok, a priori delete[] n'intervient que dans le cas de tableaux d'objets. ici ce n'ets pas le cas, donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // désallouer tout ce qui a été alloué 
    if (tab)
    {
       for ( int i = 0; i < ordre; ++i ) 
          if (tab[i]) // pas nécessaire dans ton cas je pense
             delete tab[i];
     
       delete tab;
    }

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 65
    Par défaut
    Navré mais ça ne marche pas non plus :

    ca me met dans tous les cas et toujours sur le "delete tab":





    ....
    ??


    Encore merci de ton aide...

  8. #8
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    je viens de m'apercevoir qu'il y a une erreur lors de l'allocation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     tab = new double long * [ordre];  // on détermine un tableau de 'ordre' pointeurs de type double long
    for (int i=0;i<=ordre;i++)
    {
         tab[i]= new double long[ordre+1];  // on détermine un tableau de 'ordre' double long pour chaque pointeur précédent
    }
    for (int i=0;i<ordre;i++)

  9. #9
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    1- faq
    2- attention aux copies qui si non blindées finiront sur des doubles delete
    3- Ce qui existe déjà est ton ami (vector<vector<T>>, boost.multi_array, boost.ublas, blitz++, ...). Cela reste toutes fois un excellent exercice.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  10. #10
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Il faut dire dans le constructeur que tab vaut NULL par défaut sans quoi il est initialisé à n'importe quoi.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 65
    Par défaut
    Pour le destructeur, utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if (tab)
    	{
    		for ( int i = 0; i < ordre; ++i )
    		if (tab[i]) // pas nécessaire dans ton cas je pense
             delete [] tab[i];
     
    	    delete [] tab;
    	}
    En modifiant le constructeur qui effectivement avait une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    tab = new double long * [ordre];  // on détermine un tableau de 'ordre' pointeurs de type double long
    		for (int i=0;i<ordre;i++)
       		{
    			tab[i]= new double long[ordre+1];  // on détermine un tableau de 'ordre' double long pour chaque pointeur précédent
    		}
    Cela semble marcher....Toutefois il faut que je redefinisse aussi le constructeur par recopie, mais bon je devrais ya arriver.
    Merci pour votre aide.

    ++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 31/03/2008, 18h17
  2. Réponses: 2
    Dernier message: 30/01/2007, 16h55
  3. [debutant] plantage a cause du cosntructoeur et destructeur
    Par Battosaiii dans le forum Débuter
    Réponses: 11
    Dernier message: 12/11/2005, 19h13
  4. [FLASH] pb debutant
    Par ultrakas dans le forum Flash
    Réponses: 2
    Dernier message: 05/06/2003, 00h48
  5. Réponses: 3
    Dernier message: 09/02/2003, 01h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo