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

Langage C++ Discussion :

string et valgrind


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 29
    Points : 21
    Points
    21
    Par défaut string et valgrind
    Bonjour,

    j'ai des soucis avec valgrind et la classe String car cela provoque des fuites mémoire et je ne comprends pas pourquoi.
    Le problème se pose avec ma données membre string date_lim_conso.
    Ci-joint le rapport de valgrind le .cpp de ma classe et mon main.

    Merci d'avance =)



    voici ma classe, c'est une classe dérivée de Produit :
    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
     
    Sandwich::Sandwich(float hauteur_prod,float prix_prod,const string & chaine): Produit(hauteur_prod,prix_prod) {
    	cout << "Construction d'un objet de type Sandwich \n";	
    	date_lim_conso=chaine;
    }
     
    Sandwich::~Sandwich(){
    	cout << "destruction d'un objet de type Sandwich \n";	
    }
     
    string Sandwich::ObtenirDateLimConso()const{
    	return date_lim_conso;
    }
     
    void Sandwich::AfficherDatelim()const{
    	cout << "date limite de consommation : " << date_lim_conso << "\n" ;
    }
     
    void Sandwich::AfficherProd()const{
    	Produit::AfficherProd();
    	this->AfficherDatelim();
    }
     
    char Sandwich::ObtenirType()const{
    	return 'S';
    }
    des bouts de mon main :
    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
     
    int main(void){
    	// Initialisation d'un tableau dynamique
    	int taille=4;
    	Produit** tab;
    	tab=new Produit*[taille];
            tab[1]=new Sandwich(4.0,5.0,"1993 12 09");
    	cout << "\n<SANDWICH> \n \n" ;
    	tab[1]->AfficherProd();
     
    	for(unsigned int i=0; i<taille; i++)
    	{
    		//boucle pour eliminer les tab[i]
    		if(tab[i]!=NULL)
    		{delete tab[i];
    		tab[i]=NULL;}
    	}
     
    	//boucle pour eliminer tab
    	if(tab!=NULL)
    	{delete [] tab;
    	tab=NULL;}
    Mon souci, avec valgrind sont les fuites memoires et les ERRORS qui proviennent de cette ligne qui s’éliminent dès que je mets en commentaire cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    date_lim_conso=chaine;
    voici le rapport de valgrind :
    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
    ==2627== HEAP SUMMARY:
    ==2627==     in use at exit: 46 bytes in 2 blocks
    ==2627==   total heap usage: 9 allocs, 7 frees, 670 bytes allocated
    ==2627== 
    ==2627== 46 bytes in 2 blocks are definitely lost in loss record 1 of 1
    ==2627==    at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
    ==2627==    by 0x40D57D3: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
    ==2627==    by 0x40D7A47: char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
    ==2627==    by 0x40D7BB5: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
    ==2627==    by 0x41614D2: (below main) (libc-start.c:226)
    ==2627== 
    ==2627== LEAK SUMMARY:
    ==2627==    definitely lost: 46 bytes in 2 blocks
    ==2627==    indirectly lost: 0 bytes in 0 blocks
    ==2627==      possibly lost: 0 bytes in 0 blocks
    ==2627==    still reachable: 0 bytes in 0 blocks
    ==2627==         suppressed: 0 bytes in 0 blocks
    ==2627== 
    ==2627== For counts of detected and suppressed errors, rerun with: -v
    ==2627== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Au hasard, as tu mis le destructeur de la classe Produit virtuel ? http://cpp.developpez.com/faq/cpp/?p...ucteur-virtuel

    Sinon, dans ton main, tu vas lire les cases 0, 2 et 3 de ton tableau sans jamais rien avoir écrit dedans, tu risques de gros ennuis... (et puis, pour un tableau alloué dynamiquement, il y a std::vector, par exemple, ici, avec un std::vector<std::unique_ptr<Produit>> simplifierait significativement ton code)

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    Comment ça j'ai mis le destructeur de la classe produit virtuelle ? oui j'en ai un dans ma classe Produit et c'est celui de produit qui est appelé. Ca empecherait la désallocation de la mémoire d'un objet de type string ?

    Pour le main, non enfait sur le forum j'ai juste mis des bouts parce que sinon ça semblait trop long à la lecture

    Tant qu'à faire je vais regarder unique_ptr, et j'avais aussi une autre question c'est quand je mets un élément dans vector(prenons le cas où il est à la position 2) puis que je le supprime, la taille de mon vector diminue effectivement, elle revient à 1 mais quand j'appelle ma fonction afficher sur la position 2 il n'y a pas d'erreur de compilation m'affiche bien l'élément supprimé auparavant, c'est normal ?

    Merci beaucoup encore également pour les autres conseils =)

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Quand tu fais delete tab[i], tu fais delete sur un pointeur sur Produit, mais qui en fait ne pointe pas sur un objet de type produit, mais sur un objet de type Sandwich (qui dérive de Produit). Et ça, tu n'as le droit de le faire que si le destructeur de Produit est virtuel. Sinon, tout et n'importe quoi peut se passer. Sur certains compilateurs, il est possible que seule la partie de Sandwich qui vient de Produit soit détruite, c'est à dire pas ta donnée membre date_lim_conso, que j'imagine être spécifique à Sandwich, mais même ça n'est pas garanti.

    Quand tu essaye d'afficher une case qui n'existe plus dans ton vector, comme tu fait une opération que tu n'as pas le droit de faire, le programme est en droit là aussi de faire n'importe quoi. Y compris afficher une vieille valeur s'il se trouve que la mémoire n'a pas été r"utilisée pour autre chose depuis. Mais peut-être que si tu réexécutes dans 5 minutes, tu auras un comportement totalement différent, un plantage par exemple.

Discussions similaires

  1. C++, string et valgrind
    Par Alcée dans le forum SL & STL
    Réponses: 4
    Dernier message: 07/01/2005, 00h19
  2. éliminer un caractere d'un string
    Par no-vice dans le forum Langage
    Réponses: 5
    Dernier message: 09/08/2002, 14h55
  3. URGENT: retour de string
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 15/07/2002, 09h47
  4. Réponses: 2
    Dernier message: 05/06/2002, 12h29
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

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