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 :

Scope, mémoire, et copie


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut Scope, mémoire, et copie
    Bonjour,

    J'ai passé un qcm C/C++ hier et l'une des questions était (de mémoire) à peur près comme ça :

    On a la structure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct sfloat
    {
       float *myfloat;
    }
    et plus tard on a une méthode de classe qui a un attribut vector* appellé list :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void addmylist(struct sfloat mystruct)
    {
       list->push_back(& mystruct.myfloat);
    }
    On devait choisir une ou plusieurs réponses parmi les suivantes :
    1. tout va bien, c'est la fete
    2. ça va systématiquement péter quelque part apres le retour de cette fonction
    3. ça va probablement péter quelque part apres le retour de cette fonction
    4. ça va systématiquement péter quelque part pendant l'execution de cette fonction
    5. ça va probablement péter quelque part pendant l'execution de cette fonction

    J'ai indiqué 2 et 5 en me disant :
    2 : mystruct est une copie, donc après le retour de la fonction, l'adresse donnée à list pointe sur le vide
    5 : il se peut que myfloat soit null, donc l'ajout de l'élément pourrait peter

    Mais j'ai un doute en fait, vu que le c et le c++ ça remonte un peu pour moi, je suis plus si sur d'assurer en gestion de la mémoire.

    Merci de votre aide.

  2. #2
    Membre chevronné
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    list->push_back(& mystruct.myfloat);
    Tu es sûr pour ça ? Parce que là tu es en train de prendre l'adresse d'un pointeur en faisant ça !
    C'est un vecteur de float** ?
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  3. #3
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Salut,

    Tu m'as pas ton qcm sous la main ?
    Il a l'air d'avoir des questions assez vicieuses !

    Je suis d'accord avec ton explication du point 2. Mais, si je ne raconte pas de bêtise, tu va stocker n'importe quoi (vu que c'est une variable passé par valeur). Donc tu vas stocker n'importe quoi, ce qui ne doit pas poser de pb, par contre plus loin, la lecture va poser souci.

    J'hésite à dire la réponse 1 : ca va pas péter (tu stocke une adresse mémoire valide, pour le moment), mais ça pètera quand tu voudras lire la variable.

    La fonction en elle-même marche, mais le programme va péter (plus tard) parce que tu as stocké n'importe quoi.

    je rajouterais la réponse
    6. ça va probablement péter quelque part pendant l'execution de ce programme

  4. #4
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Bonjour,
    Comme Florian Goo j'ai un doute sur la ligne du push_back. C'est une liste std::list<double**> ?

    Si c'est bien ça, alors c'est la réponse 3:
    ça va probablement péter quelque part après le retour de cette fonction

    Effectivement, mystruct est passé par copie, donc l'adresse de myfloat ne voudra plus rien dire des la sortie de la fonction. Cela dit, si le contenu de list n'est jamais utilisé, ça ne posera jamais de soucie.

  5. #5
    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,
    Citation Envoyé par Nogane Voir le message
    Bonjour,
    Comme Florian Goo j'ai un doute sur la ligne du push_back. C'est une liste std::list<double**> ?

    Si c'est bien ça, alors c'est la réponse 3:
    ça va probablement péter quelque part après le retour de cette fonction

    Effectivement, mystruct est passé par copie, donc l'adresse de myfloat ne voudra plus rien dire des la sortie de la fonction. Cela dit, si le contenu de list n'est jamais utilisé, ça ne posera jamais de soucie.
    Tu peux te dire que cela va fatalement peter quelque part après le retour de la fonction.

    Quelle que soit l'origine et le but poursuivi par list, si quelqu'un prend la peine de la remplir, c'est qu'il a l'intention de l'utiliser de manière ultérieure.

    Et comme indiqué dans les réponses précédentes, la liste est remplie avec l'adresse une copie de la structure qui sera détruite lors de la sortie de la fonction.

    La question n'est donc pas de savoir si ca va pêter, mais quand ca va pêter.

    D'autant plus que l'utilisation d'un pointeur vers un conteneur de la STL est pour le moins dangereuse

    Pour moi, ce serait donc la réponse 2 la plus appropriée.

    [EDIT]prise de position plus ferme
    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

  6. #6
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Quelle que soit l'origine et le but poursuivi par list, si quelqu'un prend la peine de la remplir, c'est qu'il a l'intention de l'utiliser de manière ultérieure.
    Bon d'accord, je m'incline

Discussions similaires

  1. Copie de bloc de mémoire (avec Boost ?) ?
    Par oodini dans le forum C++
    Réponses: 7
    Dernier message: 13/02/2009, 15h26
  2. Réponses: 3
    Dernier message: 08/04/2008, 20h50
  3. Copie de blocs mémoires
    Par Dmnbp7ip dans le forum C++
    Réponses: 2
    Dernier message: 18/12/2007, 11h58
  4. Réponses: 3
    Dernier message: 02/05/2007, 08h20
  5. Réponses: 13
    Dernier message: 10/11/2006, 09h24

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