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 :

initialisation tableau de pointeurs


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de nikau6
    Homme Profil pro
    Inscrit en
    Février 2008
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Février 2008
    Messages : 406
    Par défaut initialisation tableau de pointeurs
    Bonjours à tous.

    Je voudrais savoir si il est possible de faire ceci :

    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
    class C
    {
    public:
         C(int i) :ii(i){}
    private:
        int ii;
    };
     
    C** c;
    c = (C**)std::calloc(10, sizeof(C));
    for(int i=0; i<10; i++)
        c[i] = new C(i);
     
    for(int i = 0; i<10; i++)
        delete c[i];
    std::free(c);
    Je sais que l'on ne peut réserver de la mémoire avec malloc et la libérée avec delete, mais mon exemple est différent, tout ce qui est initialisé avec malloc est libéré avec free et tous ce qui est initialisé avec new est libéré avec delete.

  2. #2
    Membre éclairé Avatar de GrosLapin
    Homme Profil pro
    Ingénieur et Etudiant
    Inscrit en
    Avril 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur et Etudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 47
    Par défaut
    Je suis pas sur de moi a 100% mais je pense que tu as le droit pour les malloc/free puisque c'est comme ça que ça marche en C.

    Après est ce que c'est la "méthode C++" c'est une autre question...

    Cependant ton code contient une erreur.
    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
    21
    22
    class C
    {
    public:
         C(char i) :ii(i){}
    private:
        char ii;
    };
     
     
    int main ()
    {
        C** c;
        c = (C**)std::calloc(10, sizeof(C));
        for(int i=0; i<10; i++)
            c[i] = new C('a');
     
        for(int i = 0; i<10; i++)
            delete c[i];
        std::free(c);
     
          return 0;
    }
    Je me suis permis de changer ta classe pour que la taille de C soit inférieure à celle d'un pointeur. Cella permet de mettre en évidence qu'il faut faire :

    c = (C**)std::calloc(10, sizeof(*C));
    EDIT :
    c = (C**)std::calloc(10, sizeof(C*));

    et non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        c = (C**)std::calloc(10, sizeof(C));
    Sans quoi tu manges un :
    “error: double free or corruption (out)”

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Salut

    La réponse de gros lapin est correcte.

    Pourquoi vouloir effectuer une telle opération ? Si tu évolues dans une base de code que tu ne peux faire évoluer qu'en partie, je peux comprendre. Ou alors tu utilises une bibliothèque qui impose des allocations à sa manière. En dehors de ces deux cas, je ne vois pas de raison de faire ce que tu fais.

    Voici la version C++ naïve de ton code:

    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
    class C
    {
      int ii;
    public:
      C(int i) :ii(i){}
    };
     
    int main() {
      C** c = new C*[10];
      for(int i=0; i<10; i++)
        c[i] = new C(i);
     
      for(int i = 0; i<10; i++)
        delete c[i];
     
      delete [] c;
      return 0;
    }
    Et après ça, je te dirais qu'il y a mille-et-une manières de coder ça. Avec un vector, avec un array (C++11), un dynarray (C+14 ), en stockant autre chose que des pointeurs (smart pointers), en encapsulant ça dans une objet qui assure la propreté de l'usage de la mémoire avec ce tableau, etc... mais ça dépend de ton besoin et du problème que tu cherches à résoudre.

  4. #4
    Membre très actif Avatar de nikau6
    Homme Profil pro
    Inscrit en
    Février 2008
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Février 2008
    Messages : 406
    Par défaut
    @groslapin : Une indirection sur le type ça na pas de sens...D'ailleurs ca na compile pas..
    Tu peux faire une double indirection sur l'instance de la classe, pour renvoyer ça taille réelle, et non la taille du pointer, mais ça revient au même que ce que je fais....

    @jlbecanard :
    Peut importe les raisons pour lesquelles je demande ça ( ce serait une autre discussion), je voulais juste savoir si c'était légal.
    Et je connais très bien la version naïve, les vector, ect..., mais ça n'est pas mon sujet.

    Donc, est-ce que mon code est bon ? Est ce que cette facon de faire cause des problèmes au niveau allocation/des-allocation de la memoire?

  5. #5
    Membre éclairé Avatar de GrosLapin
    Homme Profil pro
    Ingénieur et Etudiant
    Inscrit en
    Avril 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur et Etudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 47
    Par défaut
    Humm chez moi ça compile

    Si on reprend ma classe C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class C
    {
    public:
         C(char i) :ii(i){}
    private:
        char ii;
    };
    et que tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c = (C**)std::calloc(10, sizeof(C));
    tu va réserver 10*sizeof(char)= 10 octets. Puis tu vas faire une boucle pour stocker 10 pointeur sur C... 10*sizeof(C*) = 40.

    Personnellement je vois pas comment tu fais rentrer 40 octets en 10. Et mon pc non plus :o

    Donc ton code marche parce que sizeof(C) = sizeof(C*) mais ça veux dire que si sizeof(C) change soit tu alloueras trop de mémoire, soit tu iras dans le mur.

    EDIT : ok faute de frappe : je voulais bien sur dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c = (C**)std::calloc(10, sizeof(C*));
    My bad

  6. #6
    Membre très actif Avatar de nikau6
    Homme Profil pro
    Inscrit en
    Février 2008
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Février 2008
    Messages : 406
    Par défaut
    @groslapin : Oui, tu as raison, autant pour moi...Je n'ai pas l'habitude d'utiliser malloc/calloc... Par contre au niveau de l'indirection il y a une erreure dans ton code...

    ps : je n'avais pas vu ton dernier message.Et oui, une double indirection causerait le meme probleme... On pourrait faire aussi sizeof(*c)...

    ps-bis : Donc, est-ce que cette facon de faire cause des probleme au niveau allo/desalloc de la memoire..?

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Citation Envoyé par nikau6 Voir le message
    Peut importe les raisons pour lesquelles je demande ça ( ce serait une autre discussion), je voulais juste savoir si c'était légal.
    Et je connais très bien la version naïve, les vector, ect..., mais ça n'est pas mon sujet.
    Tant mieux. Il y a beaucoup de post de très débutants, c'est pas toujours évident de bien cerner le posteur

    Citation Envoyé par nikau6 Voir le message
    Donc, est-ce que mon code est bon ? Est ce que cette facon de faire cause des problèmes au niveau allocation/des-allocation de la memoire?
    Aucun problème, c'est légal.

  8. #8
    Membre très actif Avatar de nikau6
    Homme Profil pro
    Inscrit en
    Février 2008
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Février 2008
    Messages : 406
    Par défaut
    Ok, merci :-)

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

Discussions similaires

  1. Initialisation d'un tableau de pointeurs
    Par tintin72 dans le forum C++
    Réponses: 19
    Dernier message: 19/11/2006, 10h22
  2. tableau de pointeurs
    Par seal3 dans le forum C++
    Réponses: 7
    Dernier message: 01/11/2005, 20h51
  3. Tableau de pointeurs de fonctions
    Par Alp dans le forum C++
    Réponses: 7
    Dernier message: 29/10/2005, 13h19
  4. [Debutant] Initialisation tableau []
    Par Pumpkins dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 15/09/2004, 00h02
  5. Initialisation tableau
    Par poinclin dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 24/06/2004, 15h39

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