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

Visual C++ Discussion :

Initialisation CString Debug/Release


Sujet :

Visual C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Par défaut Initialisation CString Debug/Release
    Bonjour à tous,

    Petite question. J'ai un programme qui marche très bien en mode debug mais pas en mode release.

    J'ai réussi à trouver d'où ça vient. J'utilise un CString :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CString    test;
    sIoi.Format (_T("%u"), p_sTest);
    En mode debug, "test" prend bien la valeur demandée mais en mode release j'ai toujours <bad ptr>. D'où celà vient-il? Je pense que c'est l'option de compilation 'Basic Runtime Checks' :
    - Default en Release
    - Both (/RTC1, equiv. to /RTCsu) en Debug.

    Mais lorsque je passe à 'Both (/RTC1, equiv. to /RTCsu)' en release, j'ai un message d'erreur :
    'Both (/RTC1, equiv. to /RTCsu)' is not compatible with the option 'O2'.

    Je corrige ça tranquillou mais quand je relance ça plante encore plus. Donc, comment initialiser proprement un CString pour éviter d'avoir cette erreur?

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    c'est la valeur par défaut de test qui est explosé ?
    le plus simple est de faire le test de cette déclaration en tout début de programme pour vérifier ce point. (genre initinstance)
    pour moi la mémoire est corrompue avant.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Par défaut
    Hum pas évident.

    Oui c'est la valeur de test qui ne s'inialise pas.
    Si je place la déclaration dans le InitDialog :

    J'ai toujours <bad ptr> en mode release (pas à pas) (ce que je n'ai pas en mode debug puisque dans ce cas sIoi est correctement initialisé à "").

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    tu n'as pas changé la taille de l'alignement sur les structures ?, ou de pragma pack(x) d'alignement ?
    tu utilises des dll ? sous entendu pas de mélange avec la CRT (/MT et /MD)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Par défaut
    Merci de tes réponses tout d'abord.

    Pour les deux premiers questions, je n'ai touché à rien.

    Sinon oui, j'utilise des DLL. Sinon voici les propriétés de mon projet :

    En debug:
    Basic Runtime Check : 'Both (/RTC1, equiv. to /RTCsu)'
    Runtime Library : 'Multi-threaded Debug (/MTd)'

    En release:
    Basic Runtime Check : 'Default'
    Runtime Library : 'Multi-threaded DLL (/MD)'

    Si en release, je change ma Runtime Library à 'Multi-threaded Debug (/MTd)', ça marche. Quel est donc le problème puisque j'imagine qu'il ne faut pas laisser cette valeur en release?

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    si j'ai parlé de l'alignement c'est que j'ai déjà rencontré ce problème,
    les MFC de Visual 2005/2008 ne supportent plus un changement d'alignement mémoire. (sous vc6 c'etait possible).
    j'ai eu le cas avec le .h d'une bibliothèque qui faisait un pragma pack sans push et pop , ça plantait bien notamment sur les CString ...
    A part chercher les différences de réglages je ne vois pas trop ce que l'on peut dire de plus.
    vérifie quand meme les réglages de ton projet et des DLL pour l'alignement et la configuration de la CRT.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Par défaut
    Merci!

    C'est quoi l'option pour l'alignement dans les propriétés du projet?

    Effectivement, en vérifiant, j'ai vu que mes projets n'avaient pas tous la même configuration de la CRT. Il faut que je fixe une seule et même configuration pour tous mes projets c'est ça?
    Par exemple pour tous mes projets:
    - Debug : Runtime Library : 'Multi-threaded Debug (/MTd)'
    - Release : 'Multi-threaded (/MT)'

    Ca serait mieux?

    Pour info, en vérifiant sur msdn j'ai trouvé ça :

    Caution : Do not mix static and dynamic versions of the run-time libraries. Having more than one copy of the run-time libraries in a process can cause problems, because static data in one copy is not shared with the other copy. The linker prevents you from linking with both static and dynamic versions within one .exe file, but you can still end up with two (or more) copies of the run-time libraries. For example, a dynamic-link library linked with the static (non-DLL) versions of the run-time libraries can cause problems when used with an .exe file that was linked with the dynamic (DLL) version of the run-time libraries. (You should also avoid mixing the debug and non-debug versions of the libraries in one process.)
    Ca veut dire que soit j'utilise la version DLL soit la version statique mais jamais les deux, c'est bien cela?

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    oui c'est bien cela pas de mélange des deux modes.
    Soit tu es en bibliothèques statiques MFC + CRT (/MT)
    Soit tu es en dll partagées MFC + CRT (/MD)
    mais pas les deux.
    Alignement mémoire:
    panneau c++/génération de code/alignement des membres de la structure: valeur par défaut est la valeur conseillée (fortement).

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/07/2006, 11h33
  2. Réponses: 5
    Dernier message: 21/06/2006, 14h02
  3. Passage Mode debug -> release
    Par Bayard dans le forum MFC
    Réponses: 2
    Dernier message: 08/05/2006, 13h06
  4. Réponses: 3
    Dernier message: 18/08/2005, 10h17
  5. chargement DLL mode debug/release
    Par bihorece dans le forum C++Builder
    Réponses: 3
    Dernier message: 21/06/2004, 14h05

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