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 :

destruction d'un objet


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 54
    Par défaut destruction d'un objet
    j'ai reprogrammé la fonction récursive que l'on peut voir sur ce fil :http://www.developpez.net/forums/sho...d.php?t=140810

    de manière à ce qu'elle soit non récursive. Le problème est qu'il faut créer soi-même la file (ou pile, ou ce qu'on veut...) et par conséquent créer des objets "Etat" afin de les stocker provisoirement en mémoire pour pouvoir travailler sur eux par la suite :

    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
     
    void ContaminationBis::contamine(int x, int y, std::vector<std::vector<int>>& populus)
    {
        std::vector<Point *> stack;
        stack.insert(stack.begin(), new Point(x,y));
        Point* courant;
        while(!stack.empty())
        {
            courant = stack.back();
            stack.pop_back();
     
            if(populus[courant->x][courant->y]!=0 && populus[courant->x][courant->y]!=2)
            {
                populus[courant->x][courant->y] = 2;
                if(courant->y-1>=0 && populus[courant->x][courant->y-1]!=2)
                    stack.insert(stack.begin(),new Point(courant->x, courant->y-1));
                if(courant->x-1>=0 && populus[courant->x-1][courant->y]!=2)
                    stack.insert(stack.begin(),new Point(courant->x-1, courant->y));
     
                ...
            }
        }
    Vu que je fais de nombreux new Point(...) je veux qu'à la fin d'une itération le noeud courant sur lequel je travail soit supprimer de la mémoire sinon je vais vite la saturer. Comment dois-je faire ? je ne connais pas l'utilisation des destructeurs, est-ce que c'est ce qu'il faut les utiliser ou rien à voir?, et si c'est le cas, comment les utilise t'on ?

    merci d'avance

  2. #2
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 237
    Par défaut
    A chaque fin de programme les destructeurs des objets sont appellés. (dans une classe ils sont sous la forme : ~NomDeLaClasse() )

    Lorsque l'on crée des objets dynamiquements (ie. avec new) On obtient un pointeur sur l'objet.
    A le fin du programme le destructeur du pointeur est appellé donc le pointeur est détruit mais pas la valeur pointée. C'est une perte de mémoire. Il faut donc détruire l'objet pointé par le pointeur en utilisant delete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int * P = new int (5);
    // suite du programme...
    delete P;
    Pour un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int * P = new int [5];
    // suite du programme...
    delete [] P;

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 54
    Par défaut
    merci

  4. #4
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Salut!!

    Pourquoi tu ne fais pas simplement une stack de Point au lieu de Point*, comme ça pas de new et pas de delete à faire... c'est "plus mieux"... non ?

    et puis sur les stack, tu as push_back() et pop_back() pour les manipuler je crois... non ? plutôt que insert
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 54
    Par défaut
    je suis obligé de faire des new nan ?, comment créer l'objet Point autrement qu'en faisant un new ?

    j'utilise insert parce que l'algorithme necessite que les nouveaux points soient insérés en tête de la file or j'ai pas trouvé de méthode du style : push_front...

  6. #6
    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
    je suis obligé de faire des new nan ?, comment créer l'objet Point autrement qu'en faisant un new ?
    On n'est pas en Java ici
    new va allouer de la mémoire sur le free store et y construire ton objet, il faudra un delete pour le détruire.
    Si tu n'utilises pas new ton objet sera construit sur la pile et sera détruit automatiquement en fin de portée (ici la fin de l'appel à insert).

    j'utilise insert parce que l'algorithme necessite que les nouveaux points soient insérés en tête de la file or j'ai pas trouvé de méthode du style : push_front...
    Ca m'étonne que tu puisses le faire d'ailleurs, une pile étant de type LIFO, tu ne devrais avoir comme fonctions que push() et pop(), sans possibilité d'insérer des éléments ailleurs.
    D'ailleurs si ce que tu veux est une file (FIFO), c'est std::queue.

Discussions similaires

  1. [c#]Comment forcer la destruction d'un objet précédemment créé?
    Par Jayceblaster dans le forum Windows Forms
    Réponses: 5
    Dernier message: 24/07/2009, 14h29
  2. Réponses: 2
    Dernier message: 13/10/2007, 01h55
  3. [C#] destruction d'un objet
    Par legillou dans le forum Windows Forms
    Réponses: 3
    Dernier message: 26/06/2006, 11h19
  4. Réponses: 1
    Dernier message: 09/07/2005, 18h16
  5. Réponses: 14
    Dernier message: 02/03/2005, 18h15

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