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 :

Order de déinitialisation incorrect sur Solaris G++


Sujet :

C++

  1. #1
    screetch
    Invité(e)
    Par défaut Order de déinitialisation incorrect sur Solaris G++
    j'ai le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <cstdio>
    struct A
    {
        A() { printf("A()\n"); }
        ~A() { printf("~A()\n"); }
        static A& getA() { static A a; return a; }
    };
     
    struct B
    {
        B() { A::getA(); printf("B()\n"); }
        ~B() { printf("~B()\n"); }
    };
     
    static B b;
     
    int main(int argc, const char *argv[])
    {
        return 0;
    }
    en gros:

    b est une variable globale statique, a est aussi une variable globale (type singleton, si on veut) qui sera initialisée "sur demande" lors du premier appel

    Or, le constructeur de B depend de A; donc on devrait avoir le résultat suivant:

    et c'est ce que j'obtiens sous Windows, sous linux, sous toutes les plates-formes du monde... sauf sous Solaris. Sous solaris j'obtiens le résultat:

    les variables dynamiques sont toutes déinitialisées avant les variables statiques, bien qu'elles aient été construites avant.
    Ca marche nickel sur tous les compilateurs et même sur sunCC sur solaris; mais ca m'arrive avec gcc sur solaris.

    Quelqu'un a plus d'infos sur ce problème??
    Dernière modification par screetch ; 13/09/2011 à 12h14.

  2. #2
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    gcc est un compilateur de C. meme s'il arrive à peu près à compiler certains code en c++, il n'est pas fait pour ça. utilise g++ et regarde si tu as encore ce problème.

  3. #3
    screetch
    Invité(e)
    Par défaut
    ah euh oui j'ai pas précisé mais je compile bien avec g++

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Déjà, histoire d'être sûr, l'ordre normal est bien celui indiqué en premier (ordre de destruction == ordre inverse de complétion des constructeurs).

    Il faudrait voir quelle est la version de gcc installée. En version inférieure à 4, le support C++ est loin d'être parfait. Comme il font de l'open source (Open Solaris) sans être vraiment open, j'ai du mal à trouver d'autres sources relative à ce problème...

    Si tu as la possibilité de faire une upgrade de gcc, c'est le chemin que je prendrais à ta place.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    screetch
    Invité(e)
    Par défaut
    j'ai GCC 4.3.4 et ca me paraissait sûr. Je compile sur MacOS avec GCC 4.0 et ca marche bien aussi.
    Pour l'instant j'ai modifié mes sources (heureusement c'est du code généré, j'ai pu tout patcher d'un coup avec deux lignes de modifications) mais c'est un peu malpropre; au lieu d'avoir une variable statique j'ai une methode statique

    mes executables ont pris 10% en poids, et au lieu de retrouner une variable ca appelle une methode.

    mais bon... au moins ca crashe pas a la sortie :-/

    si quelqu'un a plus d'infos sur ce problème je suis preneur =)

  6. #6
    screetch
    Invité(e)
    Par défaut
    j'ai essayé avec GCC 4.5.1 et le bug est toujours présent. j'ai trouvé un moyen d'éviter le problème même si c'est moche, donc je passe en résolu; mais pit-être je devrais poster un rapport de bug sur GCC.

Discussions similaires

  1. [AC-2010] Appel de procédure incorrect sur ORDER BY
    Par paidge dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 27/02/2014, 09h27
  2. [Debutant GCC sur Solaris]Erreur de compilation
    Par xxaragornxx dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 13/01/2006, 17h29
  3. C sur Solaris
    Par dinver dans le forum C
    Réponses: 2
    Dernier message: 22/11/2005, 12h09
  4. utilisation de postgresql sur solaris?
    Par champion dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 25/03/2005, 14h27
  5. COMM_FAILURE sur Solaris
    Par knotty dans le forum CORBA
    Réponses: 2
    Dernier message: 21/08/2002, 17h43

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