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 :

Problème de tas avec une dll


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 36
    Points : 28
    Points
    28
    Par défaut Problème de tas avec une dll
    Bonjour à tous.

    J'ai pas mal cherché sur ce forum et ailleurs, je ne trouve pas d'explication concernant les règles d'allocations/désallocation dynamique lorsqu'on a plusieurs tas, par exemple dans mon cas, avec une dll.

    Dans mon cas, je m'assure que l'objet qui alloue, désalloue également, je pensais naïvement que ce serait suffisant pour éviter ces problèmes de tas, hors il semble que ce n'est pas le cas...
    Il semblerait que ce ne soit pas non plus le code (code dll ou exe ?) qui "décide" du tas utilisé, puisque je peux faire sans Heap Corruption un delete sur mon device créé par la méthode de la dll.

    Donc je suis un peu perdu et je n'arrive plus à désallouer un petit pointeur sans Heap Corruption.

    Si vous avez besoin de plus d'infos pour m'aider, demandez, mais globalement je ne demande pas une solution à mon cas, mais plutôt qu'on me montre le chemin pour enfin comprendre ces rouages plus précisément

  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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    La règle c'est que chaque module (processus ?) possède son tas, et que chaque désallocation doit se faire dans le module qui a fait l'allocation. Le fait que tu puisses passer outre cette règle sans plantage n'est pas un indicateur que c'est permis, c'est plutôt un coup de bol.

    Pense également à utiliser la bibliothèque standard sous forme de DLL, si plusieurs de tes modules y font appel.

    Après si tu as toujours des erreurs en suivant ces règles, il faudrait en savoir un peu plus sur ton code.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 36
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Laurent Gomila
    La règle c'est que chaque module (processus ?) possède son tas, et que chaque désallocation doit se faire dans le module qui a fait l'allocation.
    Dans ce que tu dis ici, tu parles bien du code, pas d'une éventuelle instance ? En fait dans ma solution, j'ai un projet regroupant tous mes outils compilé en lib static. Deux autre projet (en schématisant, l'exe et la dll) dépendent de ce projet, je me retrouve donc avec le code "en double" (?) dans la dll et dans l'exe. Le problème pourrait venir de là ? (une instance créée dans la dll utilise le code dll à ce niveau puis une fois passée à l'exe, le code de ce dernier ?)

    Citation Envoyé par Laurent Gomila
    Pense également à utiliser la bibliothèque standard sous forme de DLL, si plusieurs de tes modules y font appel.
    Compte-tenu de ce que j'ai dis au-dessus, compiler mes outils en dll pourrait regler le problème ? Ce serait alors cette dernière qui serait propriétaire de toutes les allocations de mes classes d'outils ?


    Juste pour plus de précisions au cas où, la classe qui me pose problème est un SharedPtr, créé par du code de la dll, il est ensuite passé à du code de l'exe pour être détruit à cet endroit. Moi je pensais naïvement que c'était l'origine de l'instance (ici la dll) qui allait dicter le tas utilisé, mais il semble que ce soitle contexte du code, exact ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 375
    Points : 41 543
    Points
    41 543
    Par défaut
    Mince, si les SharedPtr sont des templates comme ceux de boost, il est probable les différentes instances utilisent du code des différents modules.
    Et là, il est possible qu'un SharedPtr d'un module essaie de désallouer (dans son destructeur) quelque chose d'alloué dans un autre module. Et là, ça pète!
    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
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 36
    Points : 28
    Points
    28
    Par défaut
    Hum... Je n'ai pas regardé en détail l'implémentation boost des sharedptr, là c'est la mienne (proche dans le concept)

    En fait, mon problème actuel concerne l'instance comptant les ref, allouée/désallouée toujours à l'intérieur de la classe, donc toujours par le même module si je build en dll (puisque comme je l'ai dis au-dessus, linké par plusieurs modules), par contre, ta remarque m'a fait remarquer que ce n'est pas le cas avec l'instance "Sharedptrisée".... Là je crois que j'ai effectivement un problème de conception .

    Merci de vos réponses en tout cas

    Il va falloir que je me penche sérieusement sur tout ça moi, pas évident

  6. #6
    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 : 49
    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
    Citation Envoyé par Médinoc
    Et là, il est possible qu'un SharedPtr d'un module essaie de désallouer (dans son destructeur) quelque chose d'alloué dans un autre module. Et là, ça pète!
    Sauf que si on se lie avec les versions "multithread dll" des bibliothèques standard, les appels aux new et delete se font alors dans cette DLL, et non plus dans ton code ou celui de l'autre DLL, et il n'y a plus de problèmes.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 36
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par JolyLoic
    Sauf que si on se lie avec les versions "multithread dll" des bibliothèques standard, les appels aux new et delete se font alors dans cette DLL, et non plus dans ton code ou celui de l'autre DLL, et il n'y a plus de problèmes.
    Oula, tu m'intéresses là !

    Tu pourrais (ou Laurent qui en parlait également) m'en dire un peu plus ? En fait j'avoue avoir un peu de mal à voir ce qu'il faut comprendre dans "si on se lie avec les versions "multithread dll" des bibliothèques standard"

Discussions similaires

  1. Problème de UnsatisfiedLinkError avec une DLL
    Par CYFL dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 16/07/2009, 16h29
  2. Réponses: 1
    Dernier message: 31/01/2008, 16h55
  3. Problème avec une DLL dans une boucle For
    Par BraDim dans le forum Langage
    Réponses: 5
    Dernier message: 20/09/2005, 12h22
  4. Problème avec une DLL
    Par SER dans le forum Langage
    Réponses: 7
    Dernier message: 23/08/2005, 13h58
  5. 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

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