C++ Union n'accepte pas des strings
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

C++ Union n'accepte pas des strings



  1. #1
    fresa

    C++ Union n'accepte pas des strings


    ------

    Bonjour, je suis nouvelle en C++

    Je ne comprend pas pourquoi en C++, les classes avec des contructeurs/destructeurs non trivial, ou des string, ne peuvent pas être inclu dans des union?
    Lorsque j'essai d'inclure un std::string dans un union, cela m'indique : use of the delete function 'main():: perso:: perso()'. Je ne comprend pas non plus pourquoi ils utilisent le constructeur de l'union.

    Merci!

    -----

  2. #2
    pm42

    Re : C++ Union n'accepte pas des string

    Cela dépend de ta version de C++ car les normes récentes le permettent. Mais historiquement, en C, une union était juste une façon de mettre plusieurs types au même emplacement mémoire.
    Donc on ne sait pas explicitement quel est le type de données qui est à un moment dans l'union et à partir de là, quel destructeur appelé quand elle est effacé, s'il faut appeler des copy-constructeurs...
    La solution était de limiter les unions aux types simples sans destructeur et sans copy-constructeur. Ce qui n'est pas le cas de string.

  3. #3
    fresa

    Re : C++ Union n'accepte pas des string

    Bonjour, j'aurai une autre question. Vous dite que les unions sont réservé au type sans destructeur. Si dans mon union, j'ai un integer et j'ai un double, il faudra tout de même que après avoir passé la fonction main(), mon integer/double soit détruit. Dans ce cas, si l'integer/double n'a pas de destructeur, comment peut-il être détruit? Est-il détruit automatiquement? Merci

    Code:
    union S
    {
    
        double d
        int i;
    
    };
    
    int main()
    {
        S s;
        
        s.d = 4.53;
        s.i = 3;
    }
    Dernière modification par JPL ; 12/01/2021 à 22h52. Motif: ajout de la balise Code (#) pour garder l’indentation

  4. #4
    pm42

    Re : C++ Union n'accepte pas des string

    [QUOTE=fresa;6724070que après avoir passé la fonction main(), mon integer/double soit détruit.[/QUOTE]

    Vous confondez la libération de la mémoire qui est de toute manière complète lorsque le programme se finit et un destructeur qui a pour but de libérer des ressources que le constructeur ou d'autres fonctions d'une classe auraient allouées.
    Cela n'est pas la même chose : le destructeur est le code qui est appelé avant la libération de la mémoire justement pour par exemple fermer un fichier qui aurait été ouvert par la classe.

    Les types de base, int, float, etc, n'en ont pas besoin puisqu'ils n'allouent aucune ressource. String en a besoin parce qu'il gère des allocations mémoires internes pour stocker la chaine de caractères.

  5. A voir en vidéo sur Futura
  6. #5
    fresa

    Re : C++ Union n'accepte pas des string

    Bonjour, si on prend votre exemple sur le fait d'appeller un destructeur pour fermer un fichier, pourquoi appeler le destructeur alors que, après avoir passer la fonction main, il y aura tout de même une libération de mémoire? Dans le cas d'appeler un destructeur ou le fait d'attendre la libération de la mémoire à la fin d'un scoop, le résultat n'est-il pas le même? Merci!

    Pareil dans l'exemple de l'union, je ne comprend pas pourquoi certains disent que il est nécéssaire d'appeller le destructeur d'un string, si dans mon union qui suit, je passe d'un string (s.str) à un integer (s.integer), alors que à la fin de la fonction main(), il y aura bel et bien une libération de la mémoire dans le stack.

    Code:
    union S
    {
    
        std::string str;
        int integer;
    
        ~S() {}
    };
    
    int main()
    {
        S s {};
        s.str = "hello";
        s.integer = 4;
    
    }
    Dernière modification par JPL ; 12/01/2021 à 22h53. Motif: ajout de la balise PHP pour garder l’indentation

  7. #6
    pm42

    Re : C++ Union n'accepte pas des string

    Citation Envoyé par fresa Voir le message
    Bonjour, si on prend votre exemple sur le fait d'appeller un destructeur pour fermer un fichier, pourquoi appeler le destructeur alors que, après avoir passer la fonction main, il y aura tout de même une libération de mémoire?
    Comme dit plus haut : vous confondez la libération de la mémoire qui est de toute manière complète lorsque le programme se finit et un destructeur qui a pour but de libérer des ressources que le constructeur ou d'autres fonctions d'une classe auraient allouées.

    Fermer un fichier utilisé par un objet et libérer la mémoire utilisée par ce même objet sont 2 choses très différentes.

Discussions similaires

  1. Union
    Par mehdi_128 dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 30/11/2018, 19h50
  2. Union de R et R^2
    Par zaskzask dans le forum Mathématiques du supérieur
    Réponses: 54
    Dernier message: 23/01/2015, 11h36
  3. C, strings, calloc et MPI
    Par invite6ed3677d dans le forum Logiciel - Software - Open Source
    Réponses: 5
    Dernier message: 06/06/2008, 14h15
  4. L'union.
    Par neokiller007 dans le forum Mathématiques du collège et du lycée
    Réponses: 13
    Dernier message: 22/04/2008, 16h33