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 :

segmentation fault pour new


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 22
    Points : 18
    Points
    18
    Par défaut segmentation fault pour new
    bonjour,

    Je suis actuellement en train de coder en CPP et j'ai un problème d'allocation avec la fonction new.

    En effet l'allocation sur un pointeur libéré par delete et remis à NULL me renvoie une segmentation fault. J ai bien vérifié la valeur du pointeur avant l'allocation et elle est bien à 0.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    delete []chrom;
    chrom = NULL;
     
    chrom = new float[nb_Variable];
    Je précise aussi que nb_Variable est instancié et initialisé correctement.

  2. #2
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 474
    Points
    11 474
    Billets dans le blog
    11
    Par défaut
    La fonction new peut effectivement échouer, mais quand elle échoue, en fonction du compilateur elle peut retourner NULL sans lancer d'exception ou lancer une exception de type std::bad_alloc. Lorqu'elle échoue, le problème vient généralement du débordement de la mémoire autorisée pour une application (2Go de ram pour une appli Win32, si je me souviens bien, par exemple).
    Le fait que tu aies une SegFault sur un new laisse malgré tout penser que le problème est ailleurs.
    Ta variable chrom est elle un membre de classe ? Si oui, l'instance de cette classe est-elle bien initialisée ?
    A part ça, il nous faudrait de toute façon plus de code pour répondre à ta question.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    bonjour et merci de votre reponse,

    chrom fait en effet partie d'une classe (Chromosome) et est initialisé à NULL dans le constructeur par défaut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Chromosome::Chromosome(){
        chrom = NULL;
        borne_Sup= NULL;
        borne_Inf= NULL;             
    }
    l'erreur se produit dans l’opérateur d'affectation :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    Chromosome &Chromosome::operator=(const Chromosome &source)
    {
        int i;
     
        nb_gene = source.nb_gene;
     
        delete []chrom;
        chrom = NULL;
     
        chrom = new float[nb_gene];
        i=0;
        for(i=0;i<nb_gene;i++)
        {
            chrom[i] = source.chrom[i];
        }
     
     
        delete [] borne_Sup;
        borne_Sup = NULL;
     
        borne_Sup = new float[nb_gene];
        for(i=0;i<nb_gene;i++)
        {
            borne_Sup[i] = source.borne_Sup[i];
        }
     
     
        delete [] borne_Inf;
        borne_Inf = NULL;
     
        borne_Inf = new float[nb_gene];
        for(i=0;i<nb_gene;i++)
        {
            borne_Inf[i] = source.borne_Inf[i];
        }
     
        return *this;
    }

    je suis bien en dessous de la limite d'allocation. Mon programme prend maximum 1MB.

  4. #4
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    quel est le type de chrom ?
    Par contre inutile de lui affecter NULL pour faire une allocation derrière.
    nb_gene est bien > 0 ?
    Le compteur i n'a pas besoin d'être déclaré en dehors de son scope (for), puisque tu ne l'utilises pas en dehors.
    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
    Invité
    Invité(e)
    Par défaut
    salut,

    dans ton constructeur de Chromosome, tu initialises pas nb_gene.
    Si c'est un int, ta valeur par défaut sera pas 0 mais aléatoire.

    Donc peut être bien que tu fais un new Float[44568423146].

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    quel est le type de chrom ?
    chrom est float*

    Par contre inutile de lui affecter NULL pour faire une allocation derrière.
    Je le sais, mais comme la réallocation ne fonctionnait pas, je l ai rajouté.


    nb_gene est bien > 0 ?
    oui, nb_gene est égal à 5.


    Le compteur i n'a pas besoin d'être déclaré en dehors de son scope (for), puisque tu ne l'utilises pas en dehors.
    vieille habitude du C natif...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    @galerien69 : bonne observation... je l'initialise à 0 maintenant.

    Cependant dans mon problème, nb_gene est à 5.

  8. #8
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Tu peux donner le code appelé pour créer tes objets et faisant l'affectation ?
    Une raison particulière de ne pas utiliser std::vector et std::copy ?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Une raison particulière de ne pas utiliser std::vector et std::copy ?
    aucune, si ce n'est que je n'ai pas l'habitude d'utiliser des conteneurs. Il semble en effet que cela pourrait me simplifier la vie.


    Tu peux donner le code appelé pour créer tes objets et faisant l'affectation ?

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    int main(int argc, char *argv[])
    {
        int i,j,idx;
        float borne_inf,borne_sup,max_fit;
        float alea,s,temp;
        int nb_variable = 5;
        int iteration,taille;
        
        iteration = 1000;
        taille = 50;
        
        srand(time(NULL));  
        
        alea =  rand()/(double)RAND_MAX;
    
        borne_inf = - 5.12;
        borne_sup = 5.12;
        
        Ga essai(taille,iteration);
        Chromosome c(nb_variable);
        temp = 0;
        for(i=0;i<taille;i++)
        {
            for(j= 0;j<nb_variable;j++)
            {
                temp = (rand()/(double)RAND_MAX)*(borne_sup-borne_inf)+borne_inf;
                c.set_Gene(temp,j);
                c.set_Borne(borne_inf,borne_sup,j);
            }
             essai.set_Chromosome(c,i);
        }
        
        
        system("pause");
        
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Chromosome::Chromosome(int taille){
        nb_gene = taille;
        chrom = new float[nb_gene];
        borne_Inf = new float[nb_gene];
        borne_Sup = new float[nb_gene];
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void Ga::set_Chromosome(Chromosome& c,int pos){
         pop[pos] = c;
    }


    voila les initialisations.

  10. #10
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Il vient d’où pop ?

    À mon avis, il n’est pas initialisé correctement, d’où tes problèmes. Qu’est-ce qui te fait dire que c’est new qui fait le core-dump ?

Discussions similaires

  1. Segmentation fault sur new[] et delete[]
    Par Don ViP dans le forum C++
    Réponses: 4
    Dernier message: 30/04/2006, 00h29
  2. Aide pour résoudre un Segmentation fault
    Par Premium dans le forum C
    Réponses: 8
    Dernier message: 10/12/2005, 12h26
  3. [REDHAT] Segmentation fault systematique
    Par mela dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 21/09/2004, 06h05
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

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