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 :

delete et vector


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 152
    Points : 70
    Points
    70
    Par défaut delete et vector
    Bonjour à tous,

    J'ai une question qui peut paraître bête, de plus il tard. Voilà, j'ai un vector qui contient des objets et j'aimerais les delete, mais voilà. J'ai remarqué que si je faisais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delete objectVector->at(i);
    Cela ne détruisais pas l'objet contenu dans cette cellule, et qu'il fallait faire ceci pour y remédier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Object *_object = objectVector->at(i);
    delete _object;
    J'aimerais comprendre est-ce que je dois à chaque fois créer un pointer séparé pour delete un objet au lieu de faire delete sur le pointeur contenu dans le vector ? Pourtant je suis persuadé que le vector ne contient que des pointeurs et que at(i) retourne un pointeur et donc delete doit bien détruire l'objet pointé ? Un petit éclaircissement serait la bienvenue, merci d'avance !

  2. #2
    Membre actif
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    189
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 189
    Points : 213
    Points
    213
    Par défaut
    Tu les as alloués avec new ?
    Si oui : tu dois effectivement utiliser delete, mais aussi supprimer le pointeur du vector. std::vector::erase

    Si non : tu ne dois pas utiliser delete mais seulement erase.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 152
    Points : 70
    Points
    70
    Par défaut
    Oui je les ai alloués avec new et je sais que le comportement de delete sur une cellule d'un vector pose problème.

    http://www.gamedev.net/community/for...opic_id=512589

    Apparemment il faut avoir son destructeur en virtual pour que sa fonctionne. Je ne comprends pas très bien pourquoi est-ce qu'il doit être virtuel ?

  4. #4
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    http://cpp.developpez.com/faq/cpp/?p...elete_sequence


    Pour ce qui est du destructeur virtuel : pas dans ton cas. Ils parlent de virtuel dans le cas d'héritage sur le topic que t'as donné.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  5. #5
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    Citation Envoyé par jamesb Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delete objectVector->at(i);
    Si je comprend bien tu as un pointeur de vector de pointeur
    Ca me parait capillotracté ... mais pourquoi pas !

    Je ne vois pas où est le pb dans ton code, j'ai fais 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #include <iostream>
    #include <vector>
    using namespace std;
     
    class CTest
    {
        public:
            CTest() { cout << "CTest::Ctest() : " << ++nb << " instance(s)\n"; } 
            ~CTest() { cout << "CTest::~Ctest() : " << --nb << " instance(s)\n"; } 
        private:
            static int nb;
    };
     
    int CTest::nb = 0;
     
    int main(int argc, char *argv[])
    {
        vector<CTest*>* ptr = new vector<CTest*>;
        ptr->push_back(new CTest);
        ptr->push_back(new CTest);
        ptr->push_back(new CTest);
     
        for(size_t i = 0 ; i < ptr->size() ; ++i)   
            delete ptr->at(i);
        ptr->clear();
     
        delete ptr;
        cin.ignore();
        return EXIT_SUCCESS;
    }
    Et j'ai bien le résultat prévu sur la console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CTest::Ctest() : 1 instance(s)
    CTest::Ctest() : 2 instance(s)
    CTest::Ctest() : 3 instance(s)
    CTest::~Ctest() : 2 instance(s)
    CTest::~Ctest() : 1 instance(s)
    CTest::~Ctest() : 0 instance(s)
    Les appels au destructeur se font bien.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 152
    Points : 70
    Points
    70
    Par défaut
    Citation Envoyé par Goten Voir le message
    http://cpp.developpez.com/faq/cpp/?p...elete_sequence


    Pour ce qui est du destructeur virtuel : pas dans ton cas. Ils parlent de virtuel dans le cas d'héritage sur le topic que t'as donné.
    Ah d'accord, j'avais sûrement mal compris puisque je viens de faire un test et mêmes sans le virtual le desctruteur est appelé. En fait j'avais un segmentation fault et je croyais que c'était le desctructor qui n'étais pas appelé (car ce dernier libère des ressources et empêche d'avoir justement cette erreur) mais en fait c'était ma boucle for qui en enlevant avec erase le dernier élément créait l'erreur car c'était un delete dans le vide !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // ici : vector< TimedAction* > timedActionsList;
    	for (unsigned int i = 0; i < timedActionsList.size(); i++) {
    			timedActionsList.erase(timedActionsList.begin()+i);
    			delete timedActionsList.at(i); // La cellule à i n'existe plus car elle vient d'être détruite
    			return true;
    	}
    Par contre l'inverse fonctionne (d'abord delete et après erase) donc c'est tout bon.
    Désolé jmv mais c'était pas ça c'est de ma faute je me suis trompé, j'ai mal interpreté l'erreur.

    Merci à vous tous en tout cas.

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

Discussions similaires

  1. Plantage sur deletion de std::vector
    Par uriotcea dans le forum C++
    Réponses: 8
    Dernier message: 20/02/2012, 21h09
  2. delete []double et std::vector::resize()
    Par nsarras dans le forum C++
    Réponses: 4
    Dernier message: 03/05/2011, 10h03
  3. delete et std::vector
    Par adurandet dans le forum C++
    Réponses: 9
    Dernier message: 31/10/2007, 16h44
  4. problem de delete et Vector
    Par taouja dans le forum JDBC
    Réponses: 3
    Dernier message: 23/04/2007, 16h03
  5. erase et delete d'un vector
    Par Jahjouh dans le forum SL & STL
    Réponses: 3
    Dernier message: 30/11/2005, 23h11

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