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 :

éviter fuites mémoires


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de guitz
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juillet 2006
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Juillet 2006
    Messages : 728
    Par défaut éviter fuites mémoires
    Bonjour,


    Voici ma classe Ball dans ball.h :

    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
    class Ball
    {
    	public:
    		Ball(int id, int radius, int x, int y, float velocity_x, float velocity_y);
     
    		~Ball();
     
    		void move_(int l_left, int l_top, int l_right, int l_bot); // les limites gauche, haut, droite, bas 
    		void collision(Ball** balls);
     
                    const static int s_num_balls = 10;
                    static bool s_collision;
                    static int s_num_collisions;
    		static int s_min_velocity;
    		static int s_max_velocity;
     
            int m_id;
    		int m_radius;
    		int m_x;
    		int m_y;
    		double m_velocity_x;
    		double m_velocity_y;
    		double m_accel_x;
    		double m_accel_y;
     
        private:
     
            void free();
    };

    Je crée dynamiquement des instances de classe ainsi dans main.cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int i=0; i<Ball::s_num_balls; i++){
          balls[i] = new Ball(...);
    }
    Voici le destructeur vide de ma classe Ball :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Ball::~Ball() //destructeur
    {
    	//delete this;
    }

    Et voici la fonction close() dans main.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void close()
    {
        for(int i=0; i<Ball::s_num_balls; i++){
            delete balls[i];
        }
     
        ...
    }
    Est-ce que je m'y prends bien pour libérer la mémoire occupée par chaque objet Ball lors de sa déstruction ?

    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 769
    Par défaut
    Je ne vois rien de choquant mais pourquoi tu ne crées pas une classe Ball_Util (<- nom douteux)

    Je me demande même si delete[] n'appelle pas tous les destructeurs respectifs

    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
    class Ball_Util {
    public:
     
        Ball_Util() : num_balls(0) { /* ... */ }
     
        ~Ball_Util() {
    //  Version if array_balls is a C-array
            for(int nb=0; nb < num_balls; nb++){
                delete array_balls[nb];
                array_balls[nb] = NULL;
            }
        }
     
        void add_ball(Ball& ) { /* ... */ }
        void add_multi_balls(vector<Ball>& ) { /* ... */ }
     
    //  void operator+ (Ball& ) { /* ... */ } // Or a non-member version
     
        void test_collisions() { /* ... */ }
     
    private: /*protetected:*/
     
        Ball* array_balls;
    //  vector<Ball> array_balls;
     
    private: /*protetected:*/
     
        int num_balls;
        bool collision;
        int num_collisions;
        int min_velocity;
        int max_velocity;
    };
    Édit: Médinoc a raison , mais c'est du code vite-fait pour montrer qu'on peut concevoir de manière à éviter 2-3 trucs comme des variables statiques dans chaque balle.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    La classe, je l'appellerais probablement ball_collection ou bien ball_manager.

    Citation Envoyé par foetus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void add_ball(Ball& ) { /* ... */ }
    Ta fonction add_ball(), si elle prend une référence en paramètre, elle a intérêt à faire une copie de l'objet, et non en prendre possession.



    @guitz: Ta fonction membre collision() devrait retourner un Booléen plutôt que jouer avec une variable globale. De plus, elle devrait probablement être déclarée const, ainsi que son paramètre, si la détection de collision n'est pas censée modifier les balles.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    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 294
    Billets dans le blog
    2
    Par défaut
    Problème: éviter fuites mémoires. (titre du fil)
    Solution: Ne pas utiliser de pointeur.

    Hope it helps.

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    C'est vrai que les pointeurs nus sont la source première de fuites mémoires.
    S'en passer autant que possible au profit des références et du RAII réduit considérablement le risque.

    pour rappel, le RAII de pointeur est std::unique_ptr et std::share_ptr.

  6. #6
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Pourquoi tu n'utilises pas std::vector dans ton code ?

    Grosso modo, pour ne pas avoir de fuites mémoires, il suffit de ne pas utiliser directement l'allocation dynamique.

Discussions similaires

  1. [tomcat][memoire] java.net.URL et fuite mémoire
    Par Seiya dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 09/03/2009, 10h41
  2. Réponses: 5
    Dernier message: 07/04/2008, 16h36
  3. Outil de recherche de fuite mémoire
    Par eag35 dans le forum MFC
    Réponses: 4
    Dernier message: 02/02/2005, 12h46
  4. [SWT]SWT et fuite mémoire(ou pas)
    Par menuge dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 22/06/2004, 21h40
  5. [debug] fuites mémoires
    Par tmonjalo dans le forum C
    Réponses: 3
    Dernier message: 28/07/2003, 17h20

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