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 :

operateur new et affectation de pointeur


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Points : 119
    Points
    119
    Par défaut operateur new et affectation de pointeur
    Salut,

    Est ce quelqu'un peut m'expliquer pourquoi le code suivant plante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      int** T = new int*[1];
      int*p;
      p = T[0]; // p pointe vers T[0]
      p = new int[5]; // normalement la mémoire allouée ici est celle pointée par T[0]
      delete T[0]; // Pourquoi ceci plante ?
    Merci !

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Simplement parce que p est une variable indépendante de T[0]...

    En effet, tu ne va pas assigner l'adresse de tab à T[0] en écrivant un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int** T = new int*[1];
    int * p=T[0];
    int tab[5];
    p=tab;
    Or, d'un point de vue purement logique, c'est ce que fait ton code

    Pour que le code fonctionne, il faudrait soit travailler directement sur T[0], soit veiller à prendre... l'adresse de T[0] pour pouvoir modifier ce vers quoi il pointe

    Autrement dit, le code suivant fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int** T = new int*[1];
    T[0]= new int[4];
    /*...
     * n'oublie quand même pas de libérer la mémoire allouée à T[0] avant
     * de libérer celle de T ;)
     */
    delete [] T[0];
    delete [] T;
    ainsi que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int** T = new int*[1];
    int ** p=& T[0];
    (*p)=new int[5];
    parce que, là, tu modifie "ce qui est pointé par p", autrement dit... T[0] qui recevra bel et bien... l'adresse du premier élément du tableau d'entiers alloué
    voire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int** T = new int*[1];
    int * p =new int[5];
    T[0]=p;
    (en effet, c'est ce qui est à droite du signe égal qui est affecté à ce qui se trouve à gauche )
    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
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Points : 119
    Points
    119
    Par défaut
    Hehe Merci pour ta réponse ! J'ai compris

    Au fait ce que je n'avais pas remarqué est le fait que le new dans mon code, va faire pointer P vers la nouvelle adresse mémoire allouée et donc on perd le lien avec T[0] !

    Ton premier exemple à tout éclairci. Et tes autres exemples sont utiles pour comprendre comment passer un pointeur à une fonction qui va allouer de la mémoire au pointeur passée en paramètre.

    Merci encore.

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Ceci dit, nous ne le répéterons jamais assez, l'idéal reste toujours d'éviter l'allocation dynamique de la mémoire "a mano" au profit des collections d'objets de la STL (vector, list, et tous les autres) et de les passer par... référence (éventuellement constante, si la fonction ne doit pas les modifier)
    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

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Points : 119
    Points
    119
    Par défaut
    Oui je suis tout à fait d'accord et j'utilise presque toujours la STL, mais la je n'avais pas le choix puisque j'utilise MPI dans ce projet et la STL n'est pas supportée par cette librairie.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. L'operateur new, avec ou sans ?
    Par zi_omnislasher dans le forum C++
    Réponses: 11
    Dernier message: 28/09/2007, 10h21
  2. scope de l'operateur new ?
    Par marcozar dans le forum C++
    Réponses: 2
    Dernier message: 06/08/2007, 17h29
  3. surdefinition operateur new et delete
    Par johjoh dans le forum C++
    Réponses: 23
    Dernier message: 08/12/2006, 10h10
  4. Operateur "new" renvoi NULL
    Par Demerzel_01 dans le forum C++
    Réponses: 25
    Dernier message: 07/07/2006, 09h43
  5. Allocation Dynamique de Memoire Avec Operateur New
    Par msstaf dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/06/2006, 15h49

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