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

SL & STL C++ Discussion :

std::string, operator =


Sujet :

SL & STL C++

  1. #1
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut std::string, operator =
    salut,
    je récupère des std::string, allouée dans une DLL, en utilisant l'opérateur = :

    StringExe = StringDll;

    Quand je passe dans le destructeur de la classe qui contient les chaînes de l'exe, j'ai un plantage (en mode Debug) sur CrtIsValidHeapPointer(); qui indique que le destructeur tente de libérer de la mémoire allouée dans la DLL.

    Question : l'operateur = de std::string, fait une vraie recopie physique ? nouvelle espace mémoire, etc ?

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    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 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Mauvaise nouvelle : il ne faut pas utiliser la STL dans les exports d'une dll... Ta dll est compilée avec un autre compilo je présume, un compilo qui a sa propre STL qui opère différement parrapport à ta STL, le linker n'y voie que du feux, et boum.

  3. #3
    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 : 40
    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
    Même avec le même compilo, ça risque de planter. Chaque DLL a sa propre zone d'allocation (tas), donc si tu détruis avec une DLL une variable allouée dans l'autre, boom aussi...

    Une solution est en général d'utiliser la version dynamique de la bibliothèque standard, ainsi plus de problème.

    Question : l'operateur = de std::string, fait une vraie recopie physique ? nouvelle espace mémoire, etc ?
    Ca dépend de la stratégie implémentée dans ta STL : si elle utilise le Copy-On-Write, probable que non.

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    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 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Loulou24
    Une solution est en général d'utiliser la version dynamique de la bibliothèque standard, ainsi plus de problème.
    Pour la STL dynamique / statique ça change pas grand chose. Même si c'est la même lib standard, si 2 implémentations de std::string se confrontent (COW vs normal par ex) boom (faudrait tester tiens, un prog VC++ 7.1 par exemple avec une dll qui utilise STLPORT sur le même compilo).
    Même appeler c_str() je ne suis pas sûr que ça marche à 100%. Je pense même que ça change pas grand chose.
    On peut exporter certaines parties de la STL. J'étais resté sur l'idée d'une 3° dll à part qui ne compile et exporte que la STL, les 2 autres l'utilisent. Mais beaucoup de bidouille pour une solution dont je ne sais pas si ça marcherait avec autre chose que VC++, j'ai laissé tomber.

  5. #5
    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 : 40
    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
    On peut exporter certaines parties de la STL. J'étais resté sur l'idée d'une 3° dll à part qui ne compile et exporte que la STL
    C'est ça que je voulais dire en parlant de lier avec la bibliothèque standard dynamique. Ca va produire exactement ce que tu dis, à savoir une troisième DLL qui n'exporte que la STL.

    Sinon oui, si on utilise pas la même version de la STL dans les 2 modules, boom dans tous les cas.

  6. #6
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut
    j'utilise Visual C++ 6.0, dans le même Workspace j'ai plusieurs projets, dont la fameuse DLL. Donc, même compilo, même version de STL.
    Je vais essayer de bricoler avec un buffer de char local.

  7. #7
    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 : 40
    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
    Je vais essayer de bricoler avec un buffer de char local
    Si tu lies avec la RTL tu n'auras aucun souci .

  8. #8
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut
    la RTL ? rien à voir avec Fabrice et Jean Roucas, je présume,
    tu veux pas éclairer ma lanterne à la lueur de ton expérience ?

  9. #9
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    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 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    RunTime Librairy : bibliothèque dynamique => version dll de la lib standard (msvcrt.dll...).

  10. #10
    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 : 40
    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 RTL ? rien à voir avec Fabrice et Jean Roucas, je présume
    Non en effet . En liant avec la bibliothèque standard dynamique, tu vas utiliser la DLL prévue à cet effet (MSCVCRT.DLL avec VC++) plutot que le .lib qui serait inclu à ton binaire après compilation. Ainsi tout ce qui sera allocation / désallocation sur des éléments de la bibliothèque standard seront bien tous effectués dans la même DLL.

    Dans les options de VC6, c'est "Setting" -> "C/C++"' -> "Code generation" -> "Use run-time library" -> "(Debug) Multithreaded DLL".

  11. #11
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut
    Merci Messieurs.

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

Discussions similaires

  1. [VC6 et VC8] Error C2679 operator!= std::string
    Par 3uclide dans le forum SL & STL
    Réponses: 11
    Dernier message: 09/06/2009, 18h54
  2. Problème std::string et operator <<
    Par jomeo dans le forum SL & STL
    Réponses: 2
    Dernier message: 21/02/2007, 11h36
  3. Réponses: 1
    Dernier message: 20/02/2007, 17h17
  4. cannot convert 'std::string' to 'System::String ^'
    Par broadhead dans le forum MFC
    Réponses: 1
    Dernier message: 14/06/2005, 11h37
  5. [Débutant][String] Opérations sur une chaîne
    Par gandalf_le_blanc dans le forum Général Java
    Réponses: 8
    Dernier message: 08/06/2004, 11h59

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