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 :

Tableau dynamique d'objets


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 5
    Par défaut Tableau dynamique d'objets
    Bonjour,
    Je voudrais savoir comment fait-on pour allouer et désallouer un tableau d'objet dynamique dans lesquels il y a un autre tableau d'objet dynamique aussi, sans utiliser la STL.

    J'ai fais ça comme déclaration de classe:
    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
    23
    24
    25
    class a {
     blablabla;
     
    public:
     a();
     ~a();
    }
     
    class b {
     a **tab;
     blabla;
     
    public:
     b();
     ~b();
    }
     
    class c {
     b **tab2;
     blabla;
     
    public:
     c();
     ~c()
    }
    Merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Salut,

    euh operator new et operator new[] et leurs pendants pour la libération operator delete et operator delete[] ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 5
    Par défaut
    Haha oui je sais Mais ce que je voulais dire c'est que j'ai fais un programme mais j'ai des erreurs segmentations partout du coup, je me tourne vers vous pour savoir comment faire:
    Par exemple pour reallouer tab2; j'ai fais:
    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
    23
    24
     
     b** tab_aux = new b*[taille+1];
     for (int i=0; i<taille; i++)
     {
    	tab_aux[i]=tab2[i];
     }
     
    	 tab2= new b*[10];		        
     for (int i=0; i<taille; i++)		
    	 {					
    		tab2[i]=new Espace();		
    	 }					
    	 for (int i=0; i<taille; i++)		
    	 {					
    		delete tab2[i];			
    	 }					
    	 delete[] tab2;				
     
    	 for (int i=0; i<taille; i++)		
     	 {					
    		tab2[i]=tab_aux[i];		
     	 }					
     
    	 tab2[taille]= new b ();
    Pour désalouer tab2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     for (int i=0; i<taille; i++) 
     {
    	delete tab2[i];
     }
    Sauf qu'après quand j'essaye de manipuler tab, j'ai des erreurs segmentations de partout..

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Salut,
    Et tu utilises ces opérateurs dans les constructeurs et destructeurs de ta classe pour la table et dans le cas de tableau de pointeurs, le contenant assure la création et la destruction des éléments

    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
    23
    24
    25
    26
    27
    class b {
     a **tab; // tableau de pointeurs (b alloue le tableau et initialise ou alloue les pointeurs)
     blabla;
     
    public:
     b()   { tab = new (a*)[10]; for ( int i=0; i <10; ++i ) tab[i] = new a; }
     ~b()  { detruireElements(); }
     void detruireElements()  { if ( tab ) for ( int i=0; i <10; ++i ) delete tab[i];  delete[] tab; }
       // et ici il devient impératif de définir ou interdire au moins les copies
       b( const b& x ) = delete; // création par copie interdite par exemple
       b& operator=( const b& x ) {
         if ( &x != this ) {          // l'opérateur de copie, peut par exemple
            // détruire les éléments de *this
            // allouer this->tab et les éléments de this->tab[]
            // copier les éléments de x.tab[] dans this->tab[]
         } 
         return *this;
       }
    // et on peut aussi facultativement optimiser les opérations de transfert
       b( b&& x ) : tab(x.tab) { x.tab=0; }
       b& operator=( b&& x ) {
          detruireElements();
          tab = x.tab;
          x.tab = 0;
          return *this;
       }
    };

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    La clé de la sécurité, en C++, c'est RAII.
    Ce principe consiste à encapsuler une ressource dans une classe, de façon à l'acquérir dans le constructeur et la libérer dans le destructeur.
    Cela permet de garantir que cette ressource est libérée une et une seule fois.

    C'est précisément ce que font std::vector (sur un tableau dynamique), std::fstream (sur un FILE*), std::unique_ptr (sur un pointeur obtenu via new), etc.

    Et dalfab, ton détruire_éléments est faux, puisqu'il teste le pointeur, mais ne le mets pas à nullptr.

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Citation Envoyé par leternel Voir le message
    Et dalfab, ton détruire_éléments est faux, puisqu'il teste le pointeur, mais ne le mets pas à nullptr.
    Oui, en effet, un pointeur libéré doit être impérativement remis à zéro. Ainsi dans mon exemple une exception entre les lignes 22 et 23 provoquerait un beau gâchis.

Discussions similaires

  1. [C#] Tableau dynamique d'objets
    Par Virtuelfred dans le forum C#
    Réponses: 2
    Dernier message: 17/12/2009, 17h52
  2. Problème de tableau dynamique d'objets
    Par markfish55 dans le forum C++
    Réponses: 2
    Dernier message: 07/06/2008, 13h07
  3. Transmission de tableau dynamique d'objets
    Par laulaurent dans le forum C++
    Réponses: 7
    Dernier message: 17/11/2007, 22h59
  4. Réponses: 11
    Dernier message: 26/09/2007, 21h24
  5. tableau dynamique d'objets
    Par logarithme1984 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 15/03/2007, 13h51

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