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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    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
    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 �prouv�
    �tudiant
    Inscrit en
    Octobre 2007
    Messages
    189
    D�tails du profil
    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 189
    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 confirm�
    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
    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 Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    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�.

  5. #5
    Membre confirm�
    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
    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.

  6. #6
    jmv
    jmv est d�connect�
    Membre chevronn� 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
    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.

+ 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