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 :

Programme crash à la sortie d'une méthode


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2007
    Messages : 165
    Par défaut Programme crash à la sortie d'une méthode
    Bonjour,

    Je viens du monde JAVA et je commence à me mettre sérieusement au C++ et donc je fais des exercices donnés par le prof en C++ au lieu de java pour m'habituer au langage(dont j'ai déjà la base).

    Ici le but est de faire un ensemble de int en se basant sur l'objet bitset.
    Tout à l'air de marcher mais quand j'emploie la méthode "BitSetOfShort::toString()" le programme crash en voulant en sortir.
    Avec le debugging j'ai vue que le crash arrive dans free.c qui sert à libérer la mémoire des pointeurs mais j'ai du mal à voire mon erreur.

    Voici mes classes :
    BitSetOfShort :
    H
    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
    #include <iostream>
    #include <stdio.h>
    #include <math.h>
    #include <limits.h>
    #include <bitset>
    #include <sstream>
    using namespace std;
     
    class BitSetOfShorts
    {	
    public:
    	BitSetOfShorts();
    	~BitSetOfShorts();
    	bool isEmpty();
    	int size();
    	void add(short e);
    	void remove(short e);
    	bool contains(short e);
    	void unionSets(BitSetOfShorts s);
    	void intersectionSets(BitSetOfShorts s);
    	string toString();
    	bitset<1+SHRT_MAX-SHRT_MIN> getBitset();
     
    	static int indexFromElt(short e);
    	static short eltFromIndex(int i);
     
    	static const short MIN = SHRT_MIN;
    	static const short MAX = SHRT_MAX;
    private :
    	bitset<1+SHRT_MAX-SHRT_MIN> b;
    };
    CPP
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    #ifndef BitSetOfShorts_h
    #define BitSetOfShorts_h
    #include "BitSetOfShorts.h"
    #endif
    #include "BitSetOfShortsItr.h"
     
    /* value : -X.... 0 .... +X */
    /* index :  0     X         */
     
    BitSetOfShorts::BitSetOfShorts(){}
     
    BitSetOfShorts::~BitSetOfShorts()
    {
    }
     
    int BitSetOfShorts::indexFromElt(short e)
    {
    	return e+1+MAX;
    }
     
    short BitSetOfShorts::eltFromIndex(int i)
    {
    	return i-1-MAX;
    }
     
    bool BitSetOfShorts::isEmpty()
    {
    	return b.none();
    }
     
    int BitSetOfShorts::size()
    {
    	return b.count();
    }
     
    void BitSetOfShorts::add(short e)
    {
    	b.set(e+1+MAX,true);
    }
     
    void BitSetOfShorts::remove(short e)
    {
    	b.set(e+1+MAX,false);
    }
     
    bool BitSetOfShorts::contains(short e)
    {
    	return b.at(e+1+MAX);
    }
     
    void BitSetOfShorts::unionSets(BitSetOfShorts s)
    {
    	size_t found;
    	string str = b.to_string();
    	found = str.find("1");
    	while(found!=string::npos)
    	{
    		b.set(eltFromIndex(-(static_cast<int>(found))-1),false);
    		found = str.find("1",found+1);
    	}
    }
     
    void BitSetOfShorts::intersectionSets(BitSetOfShorts s)
    {
    	size_t found;
    	string str = b.to_string();
    	found = str.find("1");
    	while(found!=string::npos)
    	{
    		if(!this->contains(found))
    		{
    			b.set(eltFromIndex(-(static_cast<int>(found))-1),false);
    		}
    		found = str.find("1",found+1);
    	}
    } 
     
    bitset<1+SHRT_MAX-SHRT_MIN> BitSetOfShorts::getBitset()
    {
    	return b;
    }
     
    string BitSetOfShorts::toString() { 
        stringstream r;
    	r<<"{";
        BitSetOfShortsItr itr(this);
    	if (isEmpty()) return ("{}");
        while (itr.hasMoreElements()){
    		r << ", " << itr.nextElement();
    		cout<<r.str()<<endl;
        }
    	r << "}";
    	itr.~BitSetOfShortsItr();
    	return r.str();
      }
    BitSetOfShortsItr (iterateur de l'ensemble) :
    H
    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
     
    #ifndef BitSetOfShorts_h
    #define BitSetOfShorts_h
    #include "BitSetOfShorts.h"
    #endif
     
    class BitSetOfShortsItr
    {
    public:
    	BitSetOfShortsItr(BitSetOfShorts* b);
    	~BitSetOfShortsItr();
     
    	bool hasMoreElements();
    	short nextElement();
    private:
    	BitSetOfShorts* b;
    	bitset<1+SHRT_MAX-SHRT_MIN> bitset;
    	int current;
    };
    CPP
    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
    #include "BitSetOfShortsItr.h"
     
    BitSetOfShortsItr::BitSetOfShortsItr(BitSetOfShorts* b2)
    {
    	b = b2;
    	bitset=b->getBitset();
    	current = -1;
    }
     
    BitSetOfShortsItr::~BitSetOfShortsItr()
    {delete b;
    ~bitset;}
     
    bool BitSetOfShortsItr::hasMoreElements()
    {
    	string::size_type found;
    	string str = bitset.to_string();
     
    	found = str.find("1", current+1);
     
    	if(found!=string::npos)
    		return true; 
    	else
    		return false;
    }
     
    //PRE : hasMoreNextElements == true
    short BitSetOfShortsItr::nextElement()
    {
    	string::size_type found;
    	string str = bitset.to_string();
    	found = str.find("1", current+1);
    	current = found;
    	return b->eltFromIndex(-(static_cast<int>(found))-1);
    }
    main.cpp :
    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
    #include <iostream>
    #include <stdio.h>
    #include <math.h>
    #ifndef BitSetOfShorts_h
    #define BitSetOfShorts_h
    #include "BitSetOfShorts.h"
    #endif
    #include "BitSetOfShortsItr.h"
     
    using namespace std;
     
    int main()
    {
        BitSetOfShorts a;
        BitSetOfShorts b;
        short ta[6] = {-3, 5, 6, -3, 9, 9};
        short tb[4] = {6, 7, -2, -3};
        int i;
        for (i=0; i<(sizeof(ta)/sizeof(short)); i++) {
    	a.add(ta[i]);
    	cout << a.toString() <<a.size() << endl;
        }
        for (i=0; i<sizeof(tb)/sizeof(short); i++) {
            b.add(tb[i]);
    	cout<<b.toString()<<b.size()<<endl;
        }
        a.unionSets(b);
        cout<<a.toString()<<a.size()<<endl;
     
        return 0;
    }
    Est-ce que vous pourriez m'aider ?

    Cordialement,

    rXp>!<

  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
    Bonsoir,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    itr.~BitSetOfShortsItr();
    Pourquoi faire ça ?
    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
    Décembre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2007
    Messages : 165
    Par défaut
    Une fois un objet utilisé ne faudrait-il pas appeler son destructeur (pour nettoyer la mémoire) ? (et les pointeurs, delete pointeur)

  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
    Non.
    S'il s'agit d'un pointeur alloué dynamiquement il faut faire un delete pour libérer la mémoire pointée.
    S'il s'agit d'un objet statique, il est supprimé dès qu'on sort de son scope.
    L'appel explicite du destructeur est très rare et clairement pas nécessaire ici.
    Le destructeur c'est juste une fonction particulière appelé quand l'objet est supprimée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BitSetOfShortsItr::~BitSetOfShortsItr()
    {delete b;
    ~bitset;}
    Même chose ?
    D'abord, tu fais un delete sur un objet que tu récupères via le constructeur et non alloué toi-même. Est-ce vraiment la marche à suivre ?
    Ensuite, qu'est-ce donc que ce ~bitset ?! ~ est un opérateur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Avec le debugging j'ai vue que le crash arrive dans free.c qui sert à libérer la mémoire des pointeurs mais j'ai du mal à voire mon erreur.
    Libération multiple.
    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
    Décembre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2007
    Messages : 165
    Par défaut
    Le ~bitset était un teste, excusez-moi pour cette ligne.
    Ensuite j'utilise un pointeur b dans l'itérateur, il n'est pas nécessaire de libérer la mémoire donc ? (car si j'enlève le delete b, le code passe)

  6. #6
    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
    Tu devrais relire ton cours sur la partie pointeur, ainsi que si ton niveau le permet ce fil de discussion.

    Un pointeur n'a rien d'extraordinaire, et il n'a non plus aucune raison d'être systématiquement delete. Un pointeur c'est avant tout un allias.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int i;
    int* pi = &i;
    delete pi;
    Ce code est faux. Pourtant j'ai un pointeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int* pi = new int;
    delete pi;
    Là c'est bon, toujours avec un pointeur.

    Le ~bitset était un teste, excusez-moi pour cette ligne.
    Tu n'as pas à t'excuser, seulement..
    Il n'y a aucune parenthèse, donc il ne s'agit pas d'une fonction.
    Qu'espérais-tu donc avec avec cette ligne ?!
    http://en.wikipedia.org/wiki/Bitwise_operation#NOT
    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.

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

Discussions similaires

  1. Crash à l'appel d'une méthode.
    Par Invité dans le forum Langage
    Réponses: 12
    Dernier message: 27/02/2015, 18h32
  2. Problème de référence à la sortie d'une méthode
    Par skini26 dans le forum Général Java
    Réponses: 7
    Dernier message: 12/06/2013, 17h40
  3. Réponses: 3
    Dernier message: 18/06/2007, 18h06
  4. Réponses: 2
    Dernier message: 29/12/2005, 10h25
  5. une méthode qui écrit dans la sortie html ?
    Par iubito dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 03/12/2003, 15h34

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