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 :

Dll et allocation mémoire


Sujet :

C++

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 582
    Points : 218
    Points
    218
    Par défaut Dll et allocation mémoire
    Bonjour,
    J'ai un problème de communication de variable entre ma dll et mon application principale. Dans quelle mémoire se fait l'allocation de variable à l'intérieur de ma dll ? Car j'ai des problèmes de dépassement de mémoire ... ou de delete...

    Merci

  2. #2
    Expert éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Ca dépend. Si tu alloues avec new/malloc, c'est alloué avec la runtime de ton compilateur. Si cette runtime est utilisée sous forme de dll, et que cette même dll est utilisée par l'exe, alors la mémoire entre ton exe et ta dll seront "communes". Si ta dll/exe utilisent des runtimes différents, ou sont compilés statiquement (pas de dll runtime en commun), chacun possède sa "propre mémoire".
    Si tu alloues avec des fonctions Windows, c'est commun, parce que le runtime Windows est commun à toutes les applis.
    Par mémoire commune, note que c'est la possibilité pour l'un de faire un delete sur un new fait par l'autre. Dans tous les cas, la dll et l'exe peuvent partager la même mémoire. C'est au niveau allocation / destruction que ça pose problème.
    Une règle d'or pour éviter les soucis : celui qui libère, c'est celui qui a alloué.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 582
    Points : 218
    Points
    218
    Par défaut
    En fait, j'ai fait un new du côté de mon application (mais cette une liste ou un tableau avec un nobmre d'élément non défini), je passe la variable en référence et je la rempli du côté de ma dll (donc en fait il y a réallocation selon le nombre d'élément). Dans ce cas comment ça marche? Parceque j'ai l'impression qu'il alloue les éléments dans une zone mémoire de ma dll...et qu'ensuite cela pose problème dans l'application.
    Pour le moment je lie ma dll statiquement, est-il conseillé de le faire dynamiquement?
    Et dans ce cas : j'ai une classe dans ma dll, comment je peux lier ma dll de manière dynamique ??

    Merci

  4. #4
    Expert éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Bon ça a l'air d'être un problème de C++. Je déplace.
    On a déjà abordé ce sujet. Si tu lies statiquement, il ne faut pas mélanger les new et delete des 2 "mondes", car l'exe et la dll gèrent chacun leur mémoire de manière séparée.
    Faudrait donner un peu de code qui montre pourquoi tu dois faire le new d'un côté et la réallocation de l'autre.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Février 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 582
    Points : 218
    Points
    218
    Par défaut
    Du côté de ma dll, je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void testdll::test(vector <string> & List){
    ....
      //ici je sais mon nombre d'élément (récupéré dans ma BD)
      ListOp.reserve(RecordCount);
      for (int i = 0; i<RecordCount;i++){
         List.push_back(Champ);
      }
    }
    Et du côté de mon application
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    vector <string> Res;
    testdll ptestdll = new testdll();
    ptestdll->test(Res);
    Res.clear();

  6. #6
    Expert éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    La STL n'est pas adaptée pour passer des objets entre des dlls/exe. Ce sont des templates, donc spécialisés au moment de leur compialtion. Ton exe et ta dll vont chacun de leur côté instancier std::vector<std::string>.
    Et ensuite y'a le problème de CRT dont je t'ai parlé.
    Celà dit, avec VC++ du moins, on peut exporter des instanciations de certains templates, dont std::vector.
    On en a parlé ici, fait une recherche sur le warning C4251:
    http://www.unknownroad.com/rtfm/VisualStudio/warningC4251.html
    Le principe : ta dll (ou ton exe, ou une 3° dll commune aux 2) va exporter std::vector<std::string>.
    Mais c'est plus une solution de dépannage qu'autre chose. Dans quel context as-tu besoin de passer par une dll ?

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Février 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 582
    Points : 218
    Points
    218
    Par défaut
    Je développe des fonctionnalités qui vont s'intégrer dans un plus gros projet et on me demande de mettre ça dans une dll (C++ Builder).
    La STL pose problème... mais quelle autre solution possible ???

    Le code précédent marche en C++ Builder aucun warning. Sauf que plusieurs appels à la fonction finit par faire une erreur OutOfMemory !!!
    Plus d'erreur si je fais :
    dans mon exe... sauf que j'alloue de la mémoire pour rien si j'ai moins de 50 élément et pose problème si j'en ai plus de 50...

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Février 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 582
    Points : 218
    Points
    218
    Par défaut
    Même avec l'instanciation des templates, j'ai le même problème....

  9. #9
    Expert éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    C'est de la bidouille...
    Pour redimensionner ton vecteur à la taille dont il a effectivement besoin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    vector <string> tmp; 
    tmp.reserve( 50 );
    testdll ptestdll = new testdll(); 
    ptestdll->test(tmp); 
    vector <string> Res( tmp.begin(), tmp.end()); 
    tmp.clear();
    mais c'est cochon, et en fait, ça revient à utiliser un tableau de taille fixe.
    Si tu crées une dll uniquement pour des commodités de développement, et qu'au final ton code sera intégré et compilé au sein de l'exe, à la rigueur, une bidouille de ce genre peut convenir, pour dépanner.
    Mais je me risquerais pas à filer ce code chez le client...

  10. #10
    Expert éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par charliejo
    Même avec l'instanciation des templates, j'ai le même problème....
    il faut explorter l'instanciation. Je ne sais pas si BC++ sait le faire.

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Février 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 582
    Points : 218
    Points
    218
    Par défaut
    La bidouille, cela me plait pas trop ....
    Comment je peux faire ça proprement.. avec d'autres type peut être???

    Mon problème c'est à partir de la dll : pouvoir allouer de la mémoire accessible ensuite à mon application ?????

  12. #12
    Expert éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 750
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par charliejo
    La bidouille, cela me plait pas trop ....


    Comment je peux faire ça proprement.. avec d'autres type peut être???
    Créer un type perso (non template, y compris pour le sstrings) est une possibilité, le plus simple reste de ne pas employer de dll (lib statique).
    Tu peux aussi employer des types existants, voir du côte de ton compilo (TStringList peut être) ou carrément COM/OLE (c'est l'artillerie lourde, surtout pour les tableaux).
    Le plus simple je pense, c'est de créer une petite classe qui wrappe vector<string> en renvoyant des const char* (pour ce cas très précis, les char* peuvent être utilisés).

    Mon problème c'est à partir de la dll : pouvoir allouer de la mémoire accessible ensuite à mon application ?????
    la mémoire allouée par ta dll est toujours accessible. Le problème est que c'est la dll qui alloue, et l'exe qui libère/réalloue (ou inversement).
    Si la dll alloue et libère, il n'y a plus de problèmes.

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Février 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 582
    Points : 218
    Points
    218
    Par défaut
    Et comment tu gères les tableaux de char * , parceque je ne connais toujours pas à l'avance mon nombre d'élément : et donc je vais bien allouer mes éléments dans ma dll ..
    Je ne vois pas comment faire ?

Discussions similaires

  1. Augmenter la capacité d'allocation mémoire d'un dll
    Par aurelius_pr dans le forum C++
    Réponses: 0
    Dernier message: 02/08/2010, 13h56
  2. Labview, DLL et allocation mémoire
    Par dreydrey dans le forum LabVIEW
    Réponses: 10
    Dernier message: 31/08/2009, 10h54
  3. Allocation mémoire
    Par DestyNov@ dans le forum C++
    Réponses: 9
    Dernier message: 23/08/2005, 08h09
  4. [Pointeur] Allocation mémoire
    Par Rayek dans le forum Langage
    Réponses: 22
    Dernier message: 20/05/2005, 10h26
  5. Allocation mémoire dynamique
    Par ITISAR dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 21/01/2005, 09h59

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