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

Bibliothèque standard C Discussion :

vsprintf_s(), thread et fuites.


Sujet :

Bibliothèque standard C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut vsprintf_s(), thread et fuites.
    Bonjour a tous,

    Je travaille actuellement sur un petit programme alliant threads et fonctions de formatage (en gros, vsprintf_s() ) et je rencontre un souci de fuite memoire.
    En gros, mon main() cree une thread qui va faire une operation quelconque, puis consigner le resultat dans un fichier de log. Helas, cette fonction qui ecrit les logs fait un appel a vsprintf_s, et j'ai pu remarquer qu'a chaque appel de la fonction, le programme faisait un memory leak. En commentant cette fonction, plus rien.
    Donc, que s'est-il passe ?

    Voici le code en question, juste celui de la thread:
    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
     
    void glb_log(unsigned int const level, char const * const function, char const * data, ...)
    {
    	char buffer[512];
    	char const *debugginglevels[] = { "ALL", "DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL", "NONE" };
    	va_list ap;
    	DWORD n;
     
    	if (logLevel == DEBUG_NONE)
    		return;
     
    	if ((level != DEBUG_ALL) && (level < logLevel))
    		return;
     
    	va_start(ap, data);
     
    	if ((n = vsprintf_s(buffer, 512, data, ap)) > 1)
    	{
    		WriteFile(logFile, buffer, n, &written, NULL);
    		FlushFileBuffers(logFile);
    	}
     
    	if (level == DEBUG_CRITICAL)
    	{
    		CloseHandle(logFile);
    	}
    	va_end(ap);
    }
    Et voila, donc si on vire le bloc du vsprintf_s, aucune fuite !
    Si quelqu'un a une idee...

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par NaeiKinDus Voir le message
    Je travaille actuellement sur un petit programme alliant threads et fonctions de formatage (en gros, vsprintf_s() ) et je rencontre un souci de fuite memoire.

    Et voila, donc si on vire le bloc du vsprintf_s, aucune fuite !
    Peut être un contre effet de la fonction 'safe' de Microsoft...

    Essaye avec vsprintf().

  3. #3
    Invité
    Invité(e)
    Par défaut
    Aucune modification, il y a toujours cette augmentation en memoire

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Les arguments de la fonction glb_log sont ils corrects ? ie : y a-t-il autant d'arguments derrière le format que de % dans le format ? les arguments sont-ils du type attendu ? ...

  5. #5
    Invité
    Invité(e)
    Par défaut
    Oui oui, j'ai bien reverifie, et c'est ainsi partout ! Un appel a un %sl pour les widechars, des %d et %s, %c comme il faut...
    De plus il me semble que sur un mauvais type, ou un nombre d'arguments incorrect le programme me sauterait immediatement a la tete non ? (enfin j'ai eu le plaisir de voir ca une fois...).

    Sinon apres quelques tests, toutes les fonctions de la famille printf sont incriminees... snprintf, vsprintf et tout le reste.

    EDIT:
    Pensez-vous que la maniere dont le thread qui appelle cette fonction est cree ou detruit pourrait influencer la maniere dont la memoire est geree ? Car je ne vois vraiment pas trop d'ou ca pourrait venir a ce niveau. Les recherches sur Google ne donnent rien ou presque, et si la librairie des printf etait touchee, je doute que je serais le seul a avoir ce genre de soucis.

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par NaeiKinDus Voir le message
    %sl pour les widechars
    Je croyait que c'était %S pour les widechar

    %s : When used with printf functions, specifies a single-byte–character string; when used with wprintf functions, specifies a wide-character string. Characters are printed up to the first null character or until the precision value is reached.

    %S : When used with printf functions, specifies a wide-character string; when used with wprintf functions, specifies a single-byte–character string. Characters are printed up to the first null character or until the precision value is reached.
    http://msdn.microsoft.com/en-us/libr...3w(VS.71).aspx
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

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

Discussions similaires

  1. Eviter une fuite mémoire sur un thread
    Par BuzzLeclaire dans le forum Langage
    Réponses: 9
    Dernier message: 03/11/2011, 11h06
  2. Probleme fuite memoire sprintf + threads
    Par Invité dans le forum Bibliothèque standard
    Réponses: 9
    Dernier message: 23/09/2008, 10h07
  3. [C# MultiThreading]"Fuites" de Handle ou de Thread
    Par djseb dans le forum Framework .NET
    Réponses: 2
    Dernier message: 14/05/2008, 10h09
  4. thread & fuite de mémoire ?
    Par neuro6 dans le forum Threads & Processus
    Réponses: 10
    Dernier message: 15/12/2007, 21h26
  5. thread et "fuite mémoire"
    Par ChriGoLioNaDor dans le forum Threads & Processus
    Réponses: 18
    Dernier message: 17/03/2006, 00h00

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