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 :

Désallocation mémoire dans une Dll


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Ingénieur
    Inscrit en
    Avril 2013
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Avril 2013
    Messages : 77
    Points : 107
    Points
    107
    Par défaut Désallocation mémoire dans une Dll
    Bonjour,

    Je suis confronté à un petit prolème : j'ai créé une Dll standard en C qui est utilisée par une interface développée avec les MFC.

    L'ensemble fonctionne correctement mais j'ai des fuites mémoires que j'ai réussie à identifier.

    Dans le point d'entrée de la Dll, j'ai déclaré deux fonctions, lors du chargement et lors du déchargement de la Dll:
    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
    BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
    {
    	switch (ul_reason_for_call)
    	{
    		case DLL_PROCESS_ATTACH:
    			_MPP_init();
    		break;
    		case DLL_THREAD_ATTACH:
    		break;
    		case DLL_THREAD_DETACH:
    		break;
    		case DLL_PROCESS_DETACH:
    			_MPP_close();
    		break;
    	}
    	return TRUE;
    }
    Lors du chargement j'alloue notamment 3 variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    static void _MPP_init(void)
    {
    ...
    	m_pIPSocket					= (s_IPSocket*) malloc(sizeof(s_IPSocket));
    	m_pIPParam					= (s_IPParamThread*) malloc(sizeof(s_IPParamThread));
    	m_pIPParam->socket			        = m_pIPSocket;
    	m_dataRecu					= (char*) malloc(sizeof(char)*32);
    	...
    };
    et lors du déchargement, je les libère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    static void _MPP_close(void)
    {
    	...
    	free(m_dataRecu);
    	free(m_pIPSocket);
    	free(m_pIPParam);
    }
    Lors de la fermeture de l'interface, et donc lors du déchargement de la Dll, il passe bien dans la fonction _MPP_Close(). En regardant la zone mémoire concernée, les variables semblent bien désallouées mais lors de l'arrêt du programme Visual Studio détecte des fuites mémoires sur ces 3 variables.

    Auriez vous des idées?

  2. #2
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    J'ai eu une quantité énorme de problèmes liés à la fonction DllMain, au point que j'en suis arrivé à ne plus l'utiliser (j'utilise des fonctions d'initialisation/terminaison définies par mes soins).
    Le blog de Raymond Chen (http://blogs.msdn.com/b/oldnewthing/.../27/63401.aspx) prévient d'ailleurs qu'il ne faut rien faire d'effrayant dans cette fonction.
    Cependant j'aurais pas dit qu'allouer de la mémoire soit quelque chose d'effrayant.

    La documentation de Microsoft dit que suivant comment l'application se termine, il est tout à fait possible que ton DllMain ne soit même pas appelé (http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx) suivant la façon dont le processus se termine. As-tu essayé de mettre un breakpoint dans ton DllMain() pour voir si le code s'exécute ? - Au temps pour moi, tu réponds déjà à cette question.

  3. #3
    Membre régulier
    Profil pro
    Ingénieur
    Inscrit en
    Avril 2013
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Avril 2013
    Messages : 77
    Points : 107
    Points
    107
    Par défaut
    Merci de ta réponse.

    Lors du chargement de la Dll, a priori, je ne fais que des allocations et des initialisations de variables. Lors du détachement, j'arrête une connexion par socket, j'arrête un thread et je désalloue des variables.
    L'arret du thread et de la liaison TCP/IP pourrait-elle poser problème?

  4. #4
    Membre régulier
    Profil pro
    Ingénieur
    Inscrit en
    Avril 2013
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Avril 2013
    Messages : 77
    Points : 107
    Points
    107
    Par défaut
    En suivant ton conseil, j'ai externalisé tout ce que j'avais mis dans le DllMain, et il se trouve que ça marche.

    Il faut donc croire que l'arrêt du thread et la coupure de la liaison TCP/IP n'avaient pas leur place ici.
    Merci

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/06/2006, 15h55
  2. Problème mémoire avec une dll par chargement dynamique
    Par widze19 dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/12/2003, 13h20
  3. [BP7] Problème chargement de ressource dans une DLL
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 11
    Dernier message: 26/07/2003, 21h36
  4. PB avec "self" dans une dll
    Par DiJiRiDouS dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2003, 09h32
  5. [VB6]Passage d'un tableau dans une DLL écrite en delphi
    Par flash dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 20/09/2002, 10h15

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