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 :

char * toto = "coucou" cache un new?


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 27
    Par défaut char * toto = "coucou" cache un new?
    Bonjour!

    je me demandais si le code suivant cachait un new:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * toto = "coucou";
    Si oui, il faudra donc faire un "delete toto", pour ne pas avoir de fuite mémoire?

    Si non, la chaine "coucou" est allouée sur la pile et sera détruite quand on sortira de son bloc, ce qui implique qu'il ne faut pas conserver de pointeur vers son adresse?

    Merci de vos réponses!

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    C'est en réalité bien plus compliqué que cela:

    toto ne cache pas un new, car new reste toujours explicite, quoi qu'il arrive.

    Par contre, il existe "quelque part" (du coté du data segment) dans la mémoire, un certain nombre de bytes qui sont utilisés pour représenter la chaine littérale constante "coucou".

    toto pointe vers l'adresse mémoire correspondant au premier caractère de cette chaine

    Tel quel, tu ne risque ni d'avoir une fuite mémoire, ni d'éprouver des problèmes de pointeur allant cueilir les marguerites, mais il faut être bien conscient que tu ne peux en aucun cas envisager de modifier la chaine de caractères (d'ailleurs, il me semble que la plupart des compilateurs t'enverraient paitre au motif que tu essaye de modifier une chaine litérale constante si tu venait à essayer )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par koala01 Voir le message
    ...mais il faut être bien conscient que tu ne peux en aucun cas envisager de modifier la chaine de caractères (d'ailleurs, il me semble que la plupart des compilateurs t'enverraient paitre au motif que tu essaye de modifier une chaine litérale constante si tu venait à essayer )
    A tel point même, que dans ton code, tu devrais écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char * toto = "coucou";
    Pour bien indiquer que l'object pointé par toto n'est pas modifiable
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 27
    Par défaut
    Merci beaucoup!

    Si j'ai bien compris:
    - je n'ai pas besoin de faire de delete sur le pointeur
    - je peux utiliser la valeur de ce pointeur dans un autre bloc sans problème, la chaine de caractère sera toujours allouée.

    Par curiosité, est ce que le programme a un mécanisme pour supprimer la chaine de caractère? Ou est ce que toutes les chaines de caractères crées de cette façon reste dans le "quelque part" jusqu'à la fin du programme?

    Et si je met, en dur dans mon code, "toto" en valeur d'un paramètre de type "char *" ou "string", cela va créer une chaine de caractère qui sera stockée "quelque part", ou le compilo ne crée pas de variable (ça parait plus intelligent) ???
    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main ( ... ){
    mafonction("toto");
    cout << "toto" << endl;  // création d'une chaine "toto" stockée "quelque part"?
    }

  5. #5
    Invité
    Invité(e)
    Par défaut
    Toutes les valeurs en dure dans le code sont forcément stockées "quelque-part" en mémoire lors du démarrage du programme.
    Et ce quelle que soit la portée du pointeur qui y accède (variable globale, variable locale, propriété d'une classe, ...).
    Cet espace mémoire ne sera libéré qu'à la fin de l'exécution du programme.

    A noter que les compilateurs font l'effort de mutualiser ce qui est mutualisable, c'est à dire ne pas recréer plusieurs fois des données textes en mémoire qui ont la même valeur. (du moins c'est le cas de gcc)

    exemple:
    const char* toto1 = "coucou";
    const char* toto2 = "coucou";

    Dans ce cas, toto1 et toto2 pointeront vers la même zone mémoire.

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Nudger Voir le message
    Toutes les valeurs en dure dans le code sont forcément stockées "quelque-part" en mémoire lors du démarrage du programme.
    Et ce quelle que soit la portée du pointeur qui y accède (variable globale, variable locale, propriété d'une classe, ...).
    Cet espace mémoire ne sera libéré qu'à la fin de l'exécution du programme.

    A noter que les compilateurs font l'effort de mutualiser ce qui est mutualisable, c'est à dire ne pas recréer plusieurs fois des données textes en mémoire qui ont la même valeur. (du moins c'est le cas de gcc)

    exemple:
    const char* toto1 = "coucou";
    const char* toto2 = "coucou";

    Dans ce cas, toto1 et toto2 pointeront vers la même zone mémoire.
    En théorie, cela va d'ailleurs encoe plus loin, dans le sens où si une chaine correspond exactement à une parite d'une autre, elle est susceptible de n'apparaitre qu'une fois (dans la chaine la plus grande), seule l'adresse de début étant différente.

    Un petit exemple pour bien me faire comprendre soit les chaines litérarles constantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main()
    {
         char * tata="Salut le monde\0";
         char * titi = "le monde\0";
         char * tutu="monde\0";
    }
    Nous pourrions nous retrouver avec, en mémoire, quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    adresse          adresse
    pointée          pointée
    par tata         par tutu
       |                 |
      |S|a|l|u|t| |l|e| |m|o|n|d|e|\0
      ------------------------------
                   |
                adresse
                pointée 
                par titi
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Xemame Voir le message
    Si j'ai bien compris:
    - je n'ai pas besoin de faire de delete sur le pointeur
    Non, l'important n'est pas que tu n'as pas besoin de faire un delete. C'est surtout que tu ne dois pas faire de delete sur ce pointeur.

  8. #8
    Membre très actif
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Par défaut
    Et du reste pourquoi ne pas faire plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string toto = "coucou";
    après tout on est en C++ pas en C pas vrai ?

  9. #9
    Membre émérite Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Par défaut
    Citation Envoyé par Xemame Voir le message
    Si non, la chaine "coucou" est allouée sur la pile et sera détruite quand on sortira de son bloc, ce qui implique qu'il ne faut pas conserver de pointeur vers son adresse?
    Cela arrive si tu déclares ta chaîne ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char toto[] = "coucou";

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 27
    Par défaut
    D'accord, merci pour toutes vos réponses!

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