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 :

regex et perte de mémoire


Sujet :

C++

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 34
    Points : 15
    Par défaut regex et perte de mémoire
    Bonjour,

    j'ai un problème avec cette fonction. Je dois l'utiliser pour recoder un dictionnaire (7000 appels). Il semble qu'il y ait une perte de mémoire mais je ne suis pas assez calé pour trouver où ?

    Est-ce la façon d'appeler la fonction ou l'appel des fonctions regex (j'ai été obligé de modifier une ligne) ?

    Soyez indulgent avec moi... je programme un peu comme un bourrin, j'en suis pleinement conscient.

    Si une bonne âme pouvait me remettre sur la bonne voie ...

    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
    96
    97
    98
    99
    100
    101
    102
     
    Fonction appelante :
     
    ...
    ...
    strcpy(tempCode,codePhone(tempCible));	
    ...
    ...
     
     
    /**************************************************************
    *****************        CODEPHONE         ********************
    **************************************************************/
    char *codePhone(char *source){					
    	// Déclaration
    	int longSource;
    	int numLin=0;
    	int k; // compteur de boucle		
    	int decal;
    	char *reg_exp;
    	int spos, epos;
    	int err,match;
    	int maxLine;
     
    	phoneComment[0]=0;
     
    	maxLine=codePhon[nivPhone].maxlinePhon;
     
    	for(numLin=0;numLin<maxLine;numLin++){
    		if(strstr(listeVolumePhon,codePhon[nivPhone].listePhon[numLin].volume)!=0){    // test du volume Phonétique
     
    			reg_exp=codePhon[nivPhone].listePhon[numLin].ciblePhon;
     
    			match=0;
    			while(match==0){ 
    				regex_t preg;
     
     
    				err = regcomp (&preg,reg_exp, REG_EXTENDED); // compilation du motif avec recherche d'erreur 
     
    				if (err == 0) // pas d'erreur dans le motif
    				{
    					size_t nmatch=0;	 
    					regmatch_t *pmatch = NULL; 
    					nmatch = preg.re_nsub; // Nombre d'occurence du motif trouvé
     
    					// Ligne originale:
    					//pmatch = malloc (sizeof(*pmatch) * nmatch); 
     
    					// Remplacée par:
    					pmatch =(regmatch_t*) malloc (sizeof(*pmatch) * nmatch);	
     
     
    					match = regexec (&preg,source, nmatch, pmatch, 0); // Lancer la recherche
    					regfree (&preg); // libérer la mémoire
     
    					/********************************************/
    					/*           le motif a été trouvé          */
    					/********************************************/
    					if (match == 0){ 
     
    						spos = pmatch[0].rm_so;
    						epos = pmatch[0].rm_eo;
     
    						spos=spos+codePhon[nivPhone].listePhon[numLin].startCible;
    						epos=spos+codePhon[nivPhone].listePhon[numLin].longCible;		
     
     
    						longSource=strlen(source);
    						char *newPhon=codePhon[nivPhone].listePhon[numLin].newPhon;
     
    						// Suppression des caractères inutiles par décalage à gauche
    						// remplacer boucle par stcpy (+rapide)??
    						decal=epos-spos-strlen(newPhon);
    						for(k=epos;k<longSource;k++) source[k-decal]=source[k];
    						source[longSource-decal]=0;
     
    						// recopie de newPhon
    						for(k=0;k<strlen(newPhon);k++) source[spos+k]=newPhon[k];
     
    						// Saut de lignes
    						numLin=numLin+codePhon[nivPhone].listePhon[numLin].sautPhon;                
    						// Commentaires
    						strncat(phoneComment,codePhon[nivPhone].listePhon[numLin].commentPhon,strlen(codePhon[nivPhone].listePhon[numLin].commentPhon));
     
     
    					}else  { 
    					# include "nomatch.cpp"
    					}
     
    					free(pmatch);
    				} // if (match==0)
     
    			} // fin test err==0	
    		} // fin test Volume	
    	} // fin boucle numlin
     
     
     
     
    	return source;
    }

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Points
    248
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Par défaut
    bonjour,

    Citation Envoyé par OrthoMaker Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pmatch =(regmatch_t*) malloc (sizeof(*pmatch) * nmatch);
    plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pmatch =(regmatch_t*) malloc (sizeof(regmatch_t) * nmatch);
    Mais là c'est du c et non du C++ donc je dirai plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    pmatch = new regmatch_t[nmatch];
    ...
    delete [] pmatch;
    sinon :

    Citation Envoyé par OrthoMaker Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    }else  { 
    	# include "nomatch.cpp"
    }
    "nomatch.cpp" est un script ??

  3. #3
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 539
    Points
    6 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 539
    Points : 6 732
    Par défaut
    Bonjour,

    il ne semble pas qu'il y ai de perte mémoire dans le code que vous montrez

    Il semble qu'il y ait une perte de mémoire, vous n'en êtes donc pas sure, il existe des outils pour détecter les pertes mémoire et savoir où sont effectuées les allocations non libérées (par exemple valgrind sous Linux, XCode sous MacOS, Application Verifier sous Windows)
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    34
    Points
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 34
    Points : 15
    Par défaut Et GCC ?
    Existe t - il un programme de détection des fuites de mémoire (inclus/ou fonctionnant avec) GCC sans utiliser un IDE?

  5. #5
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 539
    Points
    6 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 539
    Points : 6 732
    Par défaut
    heuuu, vous avez lu ma réponse précédente ?
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Points
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Par défaut
    Citation Envoyé par OrthoMaker Voir le message
    Existe t - il un programme de détection des fuites de mémoire (inclus/ou fonctionnant avec) GCC sans utiliser un IDE?
    Si tu utilises Linux Valgrind devrait sans doute t'aider à détecter les éventuelles fuites mémoires présentes dans ton programme.

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

Discussions similaires

  1. Probleme perte de mémoire - Chilkat
    Par Olphébus dans le forum Débuter
    Réponses: 5
    Dernier message: 05/08/2008, 02h16
  2. Regex et perte de mémoire
    Par OrthoMaker dans le forum C
    Réponses: 10
    Dernier message: 11/09/2007, 13h43
  3. Réponses: 11
    Dernier message: 16/07/2007, 17h33
  4. Perte de mémoire - je ne comprend pas.
    Par pilouface dans le forum C
    Réponses: 12
    Dernier message: 08/02/2007, 17h39
  5. Pertes de mémoire avec Rave
    Par stepschn dans le forum Delphi
    Réponses: 8
    Dernier message: 15/10/2006, 12h18

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