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 :

Libération d'une DLL avec dépendances


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 26
    Par défaut Libération d'une DLL avec dépendances
    Bonjour, je travaille sur un programme sous forme de DLL.
    Je possède une interface qui charge et décharge cette DLL à chaque traitement. Ma DLL possède des dépendances sur de multiples DLL.
    Mais j'ai le probleme suivant :

    soit un main suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int main()
    {
       HINSTANCE hDll;
     
       for(int i = 0 ; i < 500 ; i++)
       {
            hDll = LoadLibrary ( "madll.dll" );
            FreeLibrary ( hDll );
       }
    }
    Le fait de charger et décharger la dll me fait perdre ~~40Mo à chaque passage. Je ne comprends pas pourquoi, mais il semblerait que le FreeLibrary ne libère pas tout, et c'est uniquement lorsque je quitte l'exe que la mémoire est libérée. J'ai également essayé en annulant tous les traitements (donc ma DLL ne fait absolument rien, mais possède tjrs des dépendances), mais cela donne exactement le même résultat.

    Autre essai : je ne libère jamais la DLL. Dans ce cas, je ne perds ces fameux ~~40Mo que lors du premier LoadLibrary.

    Merci

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Est-ce que ce ne serait pas plutôt ta DLL qui aurait des fuites ?

  3. #3
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 26
    Par défaut
    Non non, aucune fuite.
    Et pour cause, je ne fais qu'un "return 0"; donc aucun traitement, aucune alloc. Juste une DLL qui ne fait rien, avec inclusion de libs et des dépendances sur d'autres DLL. (Parce que ce pb m'a rendu paranoiaque)

    D'ailleurs, si j'enleve ces libs et dll, je n'ai plus ce problème.
    Donc le simple fait de les intégrer au projet provoque ce problème...

    Edit : si je trace l'execution de ma DLL, je vois bien que la consommation mémoire n'augmente pas. C'est entre la sortie de cette DLL et l'entrée dans l'appel suivant à cette même DLL que je me prends 40Mo d'alloc supplémentaire. (et le main d'appel et celui posté plus haut, donc aucune alloc de ma part, ce qui prouve bien que cela provient du chargement de la DLL)

    Le FreeLibrary est bien censé tout libérer non ?
    Cela m'étonne que ce soit à la fin du processus que les libérations soit faites.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Peut-être esr-ce lié à ceci:
    UnRegisterClass()
    Citation Envoyé par MSDN
    Windows 95/98/Me: All window classes registered by a dynamic-link library (DLL) are unregistered when the DLL is unloaded.

    Windows NT/2000/XP: No window classes registered by a DLL registers are unregistered when the .dll is unloaded.
    Cela montre en tout cas que tout n'est pas libéré lorqu'une DLL est déchargée...
    Sait-on ce qui se passe dans les DLLs dont madll.dll dépend?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 26
    Par défaut
    42Mo de classes......
    Mais peut être est-ce du à un comportement similaire au niveau des libs.
    Si quelqu'un a une suggestion pour forcer la libération...

    Je n'ai pas accès au code de ces DLLs, puisqu'elles font partie d'une lib.
    Mais comme j'ai dit plus haut, quoiqu'il se passe, je ne fais dans mon main actuel qu'un Load et Free, donc aucun traitement n'est effectué.

    Merci

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    On ne sait donc pas ce que fait/enregistre/trafique leur DllMain()...


    Il suffit d'un chargement pour qu'elles fassent quelque chose.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 26
    Par défaut
    Effectivement...

    Je vais essayer de les charger une par une pour voir.
    Je vous tiens au courant

  8. #8
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 26
    Par défaut
    J'ai fait des tests.
    Effectivement le fait de loader & libérer l'une des DLL (ou celles qui en dépendent) provoque le phénomène.
    Mais j'ai également effectué un autre test sur un projet vierge.
    1) J'ai créé une DLL qui ne fait rien, sauf un malloc de 80Mo.
    2) J'utilise le main précédent pour la charger/décharger.

    Résultat : je ne perds pas ces 80Mo dans la série d'appel.

    :

  9. #9
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Une des dll dont tu dépends a une fuite. Attention certaines dll systèmes de Windows ne sont pas conçues pour être utilisées ainsi et peuvent être à l'origine de ces fuites.
    40 Mo c'est vraiment beaucoup. Trouver la dll fautive ne devrait pas être trop dur.

Discussions similaires

  1. Déclarer une DLL avec Inno Setup
    Par jmg69 dans le forum Delphi
    Réponses: 3
    Dernier message: 05/02/2007, 14h09
  2. probleme d'une DLL avec une page asp
    Par aymane_farissi dans le forum ASP
    Réponses: 3
    Dernier message: 29/09/2005, 16h25
  3. TForm dans une DLL avec utilisation d'Interface
    Par guedelmalin dans le forum Langage
    Réponses: 13
    Dernier message: 17/06/2005, 11h58
  4. Creer une DLL avec des icônes
    Par Larion dans le forum C++Builder
    Réponses: 5
    Dernier message: 13/03/2005, 17h28
  5. créér une dll avec borland c++ compiler
    Par juju62610 dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 26/02/2003, 09h46

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