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 :

Désallocation de pointeur local à une fonction


Sujet :

C++

Vue hybride

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 107
    Par défaut Désallocation de pointeur local à une fonction
    Bonjour,

    J'ai cherché pas mal de temps sur différents forums mais je ne trouve pas de réponse à mon souci.

    Dans une fonction main, je fais appel à une méthode membre d'une classe matrix
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main (int argc, char** argv)
    {
     
    }

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    erreur 37 ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 107
    Par défaut suite du message du dessus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    int main (int argc, char ** argv)
    {
    mesh meshPC;
    meshPC.computeFeature ();
    return 0;
    }
     
     
     
    void mesh::computeFeature ()
    {
    double* ddd;
    ddd= new double[120];
     
     
     
    delete [] ddd;
    } // plante

    Et en fait, lorsque j'appel la fonction computeFeature depuis le main, à la fin de la fonction il plante et me dit que mon executable va etre arrété, mais quand j'enleve la désallocation du pointeur ddd, ça fonctionne et je ne comprend pas pourquoi je ne peux pas désallouer moi même le pointeru ?

    Merci de vos réponses et désolé d'avoir coupé le sujet en deux (fausse manip)

    Algernon

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Le code que tu présentes est tout à fait correct et même préféré, il évite les fuites mémoires.
    Si plantage il y a, ça vient sûrement d'autre part que ces 3 lignes.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 107
    Par défaut
    Bonjour,

    en fait je me suis apperçu que lorsque je lance mon executable plusieurs fois de suite, desfois ça plante, desfois ça va marché, je n'y comprends rien lol

    Algernon

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 107
    Par défaut
    bnjour

    J'ai aussi vu que si j'instancie un objet dans la fonction computeFeature et que à la fin je fais appel au destructeru moi même, ça va désallouer l'espace réservé pour l'objet, mais vu que à la fin de la fonction, les 3 destructeurs vont être automatiquement appelé, desfois il va accepté que j'ai déjà désallouer la mémoiore pour ces objets desfois non

    Merci

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 107
    Par défaut
    Désolé,

    Je crois savoir pourquoi ça plante, c'est que lorsque on déclare un objet dans un fonction comme sur le code ci-desous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    matrix m(3, 3);
     
     
    m.~matrix (); // NON A NE JAMAIS FAIRE (FERA PLANTER 1 FOIS SUR 2)
    Je savais que à la fin de ma fonction les destructeur de la classe matrix serait appelé automatiquement, mais je pensais que le faie moi-même ca donnerai un code plus propre, mais ça fait planter une fois sur deux, d'où il ne faut jamais faire appel explicitement aux destructeurs.

    Merci

    Algernon

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Il y a deux raisons possibles :

    1. « new » peut échouer, chose que tu ne vérifies pas. Dans ce cas, une exception est lancée. Cela dit, c'est peu probable avec seulement 120 double ;
    2. Comme l'a dit Bousk, il est fort probable que ce soit dû à un effet de bord d'une procédure que tu exécutes entre les deux, et qui ne se révèle qu'au dernier moment. Le cas le plus courant et le plus classique est le dépassement de tableau. Dans le cas qui nous intéresse, tu ne peux écrire que de ddd[0] à ddd[119]. Si tu utilises toute autre valeur, tu écris en dehors de ton tableau et tu écrases ce qui ce trouve à côté, éventuellement les méta-données d'allocations de ton tableau. Donc, dès que tu essaies de le libérer : boum !


    EDIT : On a posté en même temps.

    Citation Envoyé par Algernon2 Voir le message
    Désolé,

    Je crois savoir pourquoi ça plante, c'est que lorsque on déclare un objet dans un fonction comme sur le code ci-desous:

    Je savais que à la fin de ma fonction les destructeur de la classe matrix serait appelé automatiquement, mais je pensais que le faie moi-même ca donnerai un code plus propre, mais ça fait planter une fois sur deux, d'où il ne faut jamais faire appel explicitement aux destructeurs. Merci.
    Ah, non, effectivement, c'est à ne pas faire. D'abord, parce que le compilo ne peut pas le savoir, et va te laisser continuer à utiliser un objet que tu as détruit en milieu de ton bloc. Ensuite, parce que pour les mêmes raisons, le compilo va toujours détruire lui-même l'objet à la fin du bloc. Si tu l'as déjà fait avant, forcément, ça plante.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 107
    Par défaut
    Bonjour et merci pour la réponse,

    En fait j'ai simplifier ma fonction mais je vérifie à chaque fois que l'allocaion soit bonne avec les new, mais alors si ça proviendrait d'un débordement pourquoi si je lance la fonction plusieurs fois de suite avec le même jeu de paramètre, ça plante desfois si ça plant une fois ça devrait planter tout le temps

    Algernon

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

Discussions similaires

  1. Désallouer pointeur local à une fonction
    Par Algernon2 dans le forum C++
    Réponses: 2
    Dernier message: 06/06/2012, 14h39
  2. Réponses: 13
    Dernier message: 26/03/2011, 07h31
  3. Utilité d'un pointeur vers une fonction ?
    Par Nasky dans le forum C
    Réponses: 10
    Dernier message: 20/03/2010, 19h54
  4. Probleme de pointeur sur une fonction
    Par nicky78 dans le forum C
    Réponses: 2
    Dernier message: 23/05/2004, 20h26
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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