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

SL & STL C++ Discussion :

[STL] question a propos des vectors


Sujet :

SL & STL C++

  1. #1
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut [STL] question a propos des vectors
    Bonjour, j'ai une petite question a propos des vector,
    j'ai lu http://artis.imag.fr/~Xavier.Decoret...urs_part2.html
    que la methode clear appelait tous les destructeurs et désalouait la memoire.
    ca a l'aire super chouette ca...
    Alors j'ai fait un test, voici une classe Truc.
    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 Truc
    {
    public:
    	long x;
     
    	Truc()
    	{	cout <<"constructeur par defaut Truc::Truc()"<<endl; 	}
     
    	Truc(const Truc& o) 
    	{ 	x=o.x;		cout<<"constructeur par copie"<<endl;	}
     
    	Truc(long z)
    	{	x=z; 	cout <<"constructeur Truc::Truc("<<z<<")"<<endl;	}
     
    	~Truc()
    	{	cout <<"destructeur Truc::~Truc()"<<endl;	}
     
    };
    et voici un test que je 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    int main( int argc, char* args[] )
    {
     
    	Truc* a=NULL; // je crée un pointeur sur un truc...
    	a= new Truc; // je crée le truc...
    	delete a;// je le supprime maintenant
    	a=new Truc(123); // creation d'un truc avec le constructeur
    	delete a;
    	cout<<"creation du vecteur"<<endl;
     
    	std::vector<Truc*> vect; // je crée un vecteur
    	vect.reserve(10); // la reservation de 10
    	vect.push_back(new Truc(1));
    	vect.push_back(new Truc(2));
    	vect.push_back(new Truc(3));
    	cout<<"vecteur size="<<vect.size()<<endl;
     
    	cout<<"parcours du vecteur"<<endl;
    	for (int i=0;i<vect.size();i++) 
    	{	cout <<"element vect "<<i<<" = "<<vect[i]->x<<endl;
    	}
     
    	cout<<"parcours du vecteur avec iterator"<<endl;
    	for (std::vector<Truc*>::iterator w=vect.begin();w!=vect.end();++w)
    		cout<< "iterator "<<(*w)->x<<endl;
     
     
    	cout<<"clear"<<endl;
    	vect.clear(); // appelle les destructeurs et désalloue
    	cout<<"vecteur size="<<vect.size()<<endl;
     
     
    	return EXIT_SUCCESS;
    }
    au debut, a deux reprises je crée et detruit un objet... mes constructeurs et destructeurs sont bien appellé (d'auilleur je n'arrive pas a faire appeller un constr. de recopie, quel est la syntaxe?.. qqun sait-il???)
    Bref, jusque là tout va bien.
    Ensuite, je crée mon vecteur sur Truc*,
    je lui reserve 10 places.
    ajoute 3 objets.
    je les parcours, tout va bien.
    à la fin, j'appelle clear(), et là je m'attends a voir les destructeurs, et bien pas du tout...
    comment celà sa fait-il ?

    question subsidiaire, je trouve laid la maniere dont j'accede à une donnée/metode membre avec les iterator : "(*w)->membre" n'y a t'il pas un truc plus elegant ?

    voilà, merci.
    a+

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Encore une question qui arrive par troupeau d'elle-même

    Les constructeurs par copie et destructeurs de tes éléments sont bien appelés, donc ceux de Truc*. Par contre pour ce qui est de ceux de Truc, c'est toi qui a alloué les instances c'est donc à toi de les libérer. Le vecteur ne peut évidemment pas prendre la responsabilité de détruire les éléments, ça pourrait très bien être des instances stockées sur la pile, ou des instances qui doivent vivre après la destruction du vecteur. C'est comme si tu stockais des HWND et voulais que std::vector appelle DestroyWindow dessus lors d'un clear.

    Avec un std::vector<Truc> tu verras que tous les constructeurs / destructeurs seront bien appelés.

    question subsidiaire, je trouve laid la maniere dont j'accede à une donnée/metode membre avec les iterator : "(*w)->membre" n'y a t'il pas un truc plus elegant ?
    Tu as deux niveaux d'indirection, il faut bien les remonter.

    PS : clear() ne désalloue pas forcément la mémoire, c'est plus performant dans le cas où tu dois remplir à nouveau ton vecteur.

  3. #3
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut
    Merci pour ta reponse, mais desfois je doute un peu a propos des vecteurs...
    par exemple,
    si dans mon code je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	std::vector<Truc*> vect(10,NULL); // je crée un vecteur avec reservation de 10
    	//std::vector<Truc*> vect; // je crée un vecteur
    	//vect.reserve(10); // la reservation de 10
    pour moi quand je fais vect(10,NULL) ca reserve 10 pointeurs (Truc*) et les initialise... de la meme maniere que si j'avais fait un reserve(10) (avec l'initialisation en moins)
    et bien size() me renvoie 13 au lieu de 3.

    est-ce que celà signifie que vect(10,NULL) ne fait pas QUE de la reservation ? (il alloue aussi)

    et encore une question puisque t'as l'aire super bon pour mon constructeur par copie, peux tu me donner un code simple qui utiliserai ce constructeur, je n'y arrive pas...

    Merci.

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par hpfx
    d'auilleur je n'arrive pas a faire appeller un constr. de recopie, quel est la syntaxe?.. qqun sait-il???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Truc
    {
    public:
    	long x;
    };
     
    int main(int argc, char **argv)
    {
    	Truc unTruc;   // appel du constructeur par défaut
    	Truc unAutreTruc = Truc(unTruc);  // appel du constructeur par copie
     
    	return 0;
    }
    Note: Tu auras peut-être noté que dans mon exemple de code, je n'ai pas déclaré ni le constructeur par défaut, ni le constructeur par recopie, car lorsqu'une classe ne contient que des types "simples", le compilateur créé tout cela (constructeur par défaut, constructeur par copie et destructeur) automatiquement.

  5. #5
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par hpfx
    est-ce que celà signifie que vect(10,NULL) ne fait pas QUE de la reservation ? (il alloue aussi)
    Je pense que tu nous cache quelque chose
    En effet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector<Truc*> vect(10, NULL);
    std::cout << vect.size();
    Le programme ci-dessus affiche 10.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::vector<Truc*> vect(10, NULL);
    vect.push_back(new Truc);
    vect.push_back(new Truc);
    vect.push_back(new Truc);
    std::cout << vect.size();
    Le programme ci-dessus affiche 13.

    Tu vois ce que je veux dire?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par hpfx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	std::vector<Truc*> vect(10,NULL); // je crée un vecteur avec reservation de 10
    	//std::vector<Truc*> vect; // je crée un vecteur
    	//vect.reserve(10); // la reservation de 10
    pour moi quand je fais vect(10,NULL) ca reserve 10 pointeurs (Truc*) et les initialise... de la meme maniere que si j'avais fait un reserve(10) (avec l'initialisation en moins)
    size te renvoie la taille, pas la capacité : lorsque tu fais un reserve, tu modifies la capacité, mais pas la taille du vecteur.

    Citation Envoyé par hpfx
    est-ce que celà signifie que vect(10,NULL) ne fait pas QUE de la reservation ? (il alloue aussi)
    reserve ne fait que réserver de la mémoire basé sur le type d'élément contenu. Le constructeur initialise les éléments, soit par défaut, soit avec le paramètre donné (ici NULL).

  7. #7
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut
    Merci a vous tous.

  8. #8
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    Je tiens à insister sur une chose : lorsque tu stockes des pointeurs dans un conteneur, n'oublies surtout pas de libérer la mémoire qu'ils pointent.

    Alternatives :
    - stocker des SmartPointers : http://c.developpez.com/faq/cpp/inde...S_intelligents
    - utiliser des Pointer Containers de Boost ( http://www.boost.org/libs/ptr_contai...container.html )

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

Discussions similaires

  1. Petite question a propos des itérateurs
    Par Thordax dans le forum C++
    Réponses: 32
    Dernier message: 06/07/2006, 02h45
  2. [Sql Server 2005] Question a propos des champs unicode
    Par siaoly dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 23/06/2006, 16h00
  3. [VBA-E] Question à propos des checkbox
    Par Timfg dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/04/2005, 16h09
  4. Question a propos des modulos
    Par barthelv dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 24/03/2005, 16h56

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