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 :

destructeur et vector


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 13
    Par défaut destructeur et vector
    salut !!!

    Habituellement je développe en C.
    Je debute en c++ et j'ai un petit probleme avec les destructeurs.

    J'ai créé une classe Point :

    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 Point {
     
    private:
    	int x;
    	int y;
     
    public:
    	Point();
    	Point( const int , const int );
    	Point (const Point& );	
    	const int getX() const ;
    	const int getY() const ;
    	void setX(const int) ;
    	void setY(const int ) ;	
     
    	const bool operator!=(const Point& )const;
    	const bool operator==(const Point& )const;
     
    	friend ostream& operator<<(ostream& _out, const Point& _objet);
     
    };
    sauf que je sais pas quoi mettre dans le destructeur.


    Quand j'utilise les vector de Point j'ai des soucis:


    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
     
    int main()
    {
        std::vector<Point> MonVecteur;                           
     
       MonVecteur.push_back(Point(38,48)); 
       MonVecteur.push_back(Point(2,47));  
        MonVecteur.push_back(Point(20,8));
     
       MonVecteur.clear();
     
       cout << MonVecteur.front() << std::endl; /* ici ca m'affiche (38,48) */
     
    return 0;
    }
    je pense( quasi sur) que mon probleme vient du fait que j'ai pas de destructeur.
    J'ai bien essayé quelques trucs mais "au mieux" ca me renvoyait (0,0) alors que moi je voudrai supprimer tout les objets quand je fais un clear, afin que le front me renvoit rien.


    MERCI d'avance

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 62
    Par défaut
    Déjà, pourquoi tu veux afficher le premièr élement d'un vecteur vide ?
    Tu veux que ton programme plante ou quoi ?
    Si tu veux confirmer que le vecteur est vide, teste la taille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      vecteur.empty() ;
      // ou 
       vecteur.size() == 0 ;
    Là tu tapes dans une zone mémoire non définit, donc ne t'étonnes pas
    d'avoir des résultats incohérents.

    En ce qui concerne le destructeur de point, ne te fais pas de bille.
    Le compilateur a la gentillesse d'implémenter automatiquement un destructeur si tu ne le fais pas.
    Et comme c'est une classe très simple, il le fait très bien.

  3. #3
    Invité(e)
    Invité(e)
    Par défaut
    Bonsoir
    Il faut aussi noter (voir FAQ pour plus de précisions) qu'un destructeur est surtout utilisé pour libérer les ressources utilisées : c'est à dire les objets (ou autres structures) créés dynamiquement. c'est à dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    maclasse * pointeur;
    pointeur = new maclasse;
    /*....*/
    delete pointeurSurInt;
    Donc dans le cas de membres qui ne sont pas des pointeurs, on peu effectivement s'en dispenser, le compilateur s'en charge tout seul comme un grand

    voila
    mabu

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 82
    Par défaut
    Ca déclenche une exception ou un segfault ton code.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 13
    Par défaut
    ( désolé j'ai remis la bonne classe )
    en fait dans mon programme, je supprime souvent les premiers éléments du vector ( à l'aide d'erase), mais il reste encore des éléments dans le vector.

    Mais quand je fais un front() il me renvoit un point (0.0) ce qui est pas logique.

    (je sais pas si je suis super clair, je vais essayer de remettre un bout de code)

  6. #6
    Membre chevronné
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Par défaut
    Je suis d'accord avec ce qui a été posté plus haut (çà devrait planter, pas besoin de destructeur car aucune allocation dynamique...) mais pour moi la question serait plutôt: Pourquoi cela affiche-t-il quelquechose ? (au lieu de déclancher une exception)

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 62
    Par défaut
    C'est du C++. Il n'ya pas de machine virtuelle pour contrôler ce que l'on fait.
    Rien n'empêche de faire n'importe quoi avec la mémoire, communément appelé le jardinage.

    Les exceptions ne sont pas gérées en natif et la STL ne jete pas d'exception.
    Les classes de flux peuvent lancer des exceptions pour quelques cas d'erreur
    parfaitement identifiés, mais il n'y pas de contrôl possible pour validiter les données qui sont envoyé dans le flux.

    Donc soit on obtient un peu n'importe quoi (comme pour notre ami)
    Soit un plantage si on va chercher une zone mémoire en dehors des limites
    du programme. Dans le deuxième cas, c'est l'OS qui détecte l'erreur.

  8. #8
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Les exceptions ne sont pas gérées en natif et la STL ne jete pas d'exception
    Hmm... pas vraiment non, les conteneurs peuvent lever pas mal d'exceptions (out_of_range, length_error, bad_alloc, ...)

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Août 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 13
    Par défaut
    ok ok je vous remercie je vais regarder de ce coté

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Pour un vecteur, si on veut un contrôle de la validité d'un index :
    - Soit on utilise une bonne STL en mode debug (VC++8.0 le fait, STLPort aussi je crois)
    - Soit au lieu d'utiliser vector::operator[], on utilise vector::at()

    Pour le coup du destructeur :
    A la destruction d'un objet, le compilateur fait automatiquement (et sans qu'on ait le choix) les tâches suivantes dans l'ordre :
    - Appel du destructeur
    - Pour chaque donnée membre de la classe, le destructeur est appelé (dans l'ordre inverse de la création), récursivement.
    - Puis les destructeurs d'éventuelles classes de base sont appelés, récursivement.
    - Puis la mémoire prise par l'objet est libérée

    Donc, dans le destructeur, on a besoin de ne se préocuper que de ce qui a été alloué (au sens large : mémoire dynamique, handle, mutex...) manuellement dans la classe. Dans Point, rien n'est alloué manuellement, donc rien à faire.

    D'ailleurs, en bon C++, comme on a tendance à encapsuler toutes ces allocations dans des classes spécifiques (genre string, vector, smart_ptr), il n'est en fait pas si courant de devoir définir un destructeur (sauf pour dire qu'il doit être virtuel).

    Enfin, une règle : Si parmis les trois fonctions destructeur, operator=, constructeur par recopie, l'une ne doit pas avoir son comportement par défaut, il faut en général les redéfinir toutes trois.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  11. #11
    Membre éprouvé Avatar de PINGOUIN_GEANT
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 149
    Par défaut
    je me souviens d'un thread où quelqu'un (compilateur gcc) désallouait un tableau d'entiers puis demandait immédiatement après la première valeur et cela donnait le bon résultat.
    un autre a essayé sous windows et cela donnait n'importe quoi.
    dans le premier cas il n'y a avait pas effacement de la mémoire désallouée.
    Serait-il possible que cela soit la même chose avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    myVector.clear():
    cout<<myVector.front();

  12. #12
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    clear() remet simplement le compte d'éléments à zéro, mais la mémoire et les éléments précédents restent inchangés. Donc oui, très probablement.

  13. #13
    Membre chevronné
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Par défaut
    Citation Envoyé par Loulou24
    clear() remet simplement le compte d'éléments à zéro, mais la mémoire et les éléments précédents restent inchangés. Donc oui, très probablement.
    Et pourquoi clear fait çà ?
    Car moi je lis ceci:
    void
    clear();
    Deletes all elements from the vector.
    ...Alors pourquoi çà ne le fais pas ?

    J'ai déjà remarqué çà avec un ostringstream, pour le vider je suis obligé de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ss.clear();
    ss.str("");
    ... Car un simple clear ne suffit pas toujours (je dis pas toujours car en plus, çà dépend des circonstances).

    Je trouve çà illogique.

  14. #14
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Non en fait j'ai dit une bêtise, clear() détruit (appelle le destructeur) des objets stockés.

    [pour moi]

    [/pour moi]

    La mémoire allouée reste elle bien allouée par contre.

    istream::clear() sert à remettre à zero les bits d'erreurs du flux, rien à voir avec le clear() des conteneurs

  15. #15
    Membre chevronné
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Par défaut
    Citation Envoyé par Loulou24
    istream::clear() sert à remettre à zero les bits d'erreurs du flux, rien à voir avec le clear() des conteneurs
    Ok merci pour cette précision extrèmement utile.
    Ce n'était pas ce qu'on m'avait répondu (je rétrouve plus le message, le délestage est vraiment extrème )

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

Discussions similaires

  1. delete, vector et destructeur
    Par MrPchoun dans le forum C++
    Réponses: 12
    Dernier message: 22/03/2015, 22h48
  2. Réponses: 6
    Dernier message: 04/08/2013, 20h56
  3. STL::Vector - Destructeur.
    Par Quentin D dans le forum SL & STL
    Réponses: 3
    Dernier message: 03/07/2007, 15h01
  4. "vector" provoque "syntax error", malgré
    Par seenkay dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 24/08/2003, 03h21
  5. Réponses: 2
    Dernier message: 11/07/2003, 18h24

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