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 :

fuite mémoire stl


Sujet :

SL & STL C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Par défaut fuite mémoire stl
    bonjour,

    j'ai parcouru le forum et la faq..en vain.. J'ai toujours un problème de fuite mémoire, qui je pense vient de ma list.

    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
    class PacketListEntry {
    public:
    	Packet *p;
    	double rxStartTime;
    	double rxEndTime;
    	double Pr;
    	int right_ths;
     
    	PacketListEntry(Packet *packet,double start,double end ,double pr,int ths):
    		p(packet),rxStartTime(start),rxEndTime(end),Pr(pr),right_ths(ths){
     
    	}
    	PacketListEntry(){
     
    	}
    	~PacketListEntry(){
    		delete p;
    	}
    };
    typedef std::list<PacketListEntry> PacketList_t;
    exemple d'ajout et de suppression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DetectList.push_back(*(new PacketListEntry(p,start,end,Pr,0)));//DetectList de type PacketList_t
     
    for (PacketList_t::iterator it = DetectList.begin(); it!= DetectList.end();) {
    	        delete it->p;
    		it->p=NULL;
    		it = DetectList.erase(it);
    	}
    DetectList.clear();
    pour vous c'est bon?

    merci

  2. #2
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    1. A aucun moment tu ne vérifie la validité de ton Packet,
    2. Tu ne supprime jamais l'espace mémoire alloué par le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new PacketListEntry(p,start,end,Pr,0)
    lors de l'ajout dans ta liste.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Par défaut
    l'utilisation d'un objet statique résoud donc le problème?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DetectList.push_back(PacketListEntry(p,start,end,Pr,0));

  4. #4
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Je pense que oui, à la condition que tu modifies la déclaration de ta liste.
    Elle doit devenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::list<PacketListEntry>
    et non plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::list<PacketListEntry*>
    EDIT: au temps pour moi, j'avais pas vu la déclaration de la liste

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Citation Envoyé par christouf Voir le message
    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
    class PacketListEntry {
    public:
    	Packet *p;
    	double rxStartTime;
    	double rxEndTime;
    	double Pr;
    	int right_ths;
     
    	PacketListEntry(Packet *packet,double start,double end ,double pr,int ths):
    		p(packet),rxStartTime(start),rxEndTime(end),Pr(pr),right_ths(ths){
     
    	}
    	PacketListEntry(){
     
    	}
    	~PacketListEntry(){
    		delete p;
    	}
    };
    typedef std::list<PacketListEntry> PacketList_t;
    Il manque le constructeur de copie et l'opérateur d'affectation à cette classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DetectList.push_back(*(new PacketListEntry(p,start,end,Pr,0)));//DetectList de type PacketList_t
    à remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DetectList.push_back(PacketListEntry(p,start,end,Pr,0));
    effectivement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (PacketList_t::iterator it = DetectList.begin(); it!= DetectList.end();) {
    	        delete it->p;
    		it->p=NULL;
    		it = DetectList.erase(it);
    	}
    Cette boucle est à supprimer, la libération s'effectue dans le destructeur des objets.

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Le packet va être détruit dès l'insertion dans la liste puis effacer plusieurs fois dès que tu vas travailler sur la liste (car la STL utilise des copies à tout bout de champs et non des références constantes). Donc tu ferais peut-être mieux de passer par des pointeurs intelligents.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Par défaut
    cela va donc fonctionner sans pointeur intelligent mais ce n'est pas optimal?

    j'ai redéfini ma classe de cette façon :
    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
    class PacketListEntry {
    public:
    	Packet *p;
    	double rxStartTime;
    	double rxEndTime;
    	double Pr;
    	int right_ths;
    	PacketListEntry(){
    	}
    	PacketListEntry(Packet *packet,double start,double end ,double pr,int ths):
    		p(packet),rxStartTime(start),rxEndTime(end),Pr(pr),right_ths(ths){
    	}
    	PacketListEntry(const PacketListEntry& PacketList)
    	:p(PacketList.p->Copy()),rxStartTime(PacketList.rxStartTime),Pr(PacketList.Pr),right_ths(PacketList.right_ths){
    	}
    	PacketListEntry& operator= (const PacketListEntry& p); 
    	~PacketListEntry(){
    		delete p;
    	}
    };
    les éléments de la liste sont ensuite effacés en recherchant l'uid du packet p grâce au code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct PacketListEntryEgal :
    	public binary_function<PacketListEntry, Count_t, bool> {
    	bool operator()(const PacketListEntry & m, Count_t nb) const {
    		return (m.p)->uid == nb;
    	}
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    bool L1Proto_UWBmicrotrame::RemoveDetectListEntry(Packet *p) {
    	PacketList_t::iterator it;
    	it = find_if(DetectList.begin(), DetectList.end(), bind2nd(
    			PacketListEntryEgal(), p->uid));
    	if (it!=DetectList.end()) {
    		DetectList.erase(it);
    		return true;
    	} else {
    		return false;
    	}
    }
    est-ce qu'une map ne serait pas plus efficace pour les nombreux suppressions d'éléments?

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    OK, dans ton constructeur de recopie, tu crées explcitement une copie, donc ça devrait passer.

Discussions similaires

  1. Singleton et Fuite mémoire avec objet STL
    Par Robxley dans le forum C++
    Réponses: 7
    Dernier message: 09/02/2011, 11h01
  2. [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
  3. [STL] Fuite mémoire et STL
    Par SpongeBob dans le forum SL & STL
    Réponses: 6
    Dernier message: 19/07/2007, 17h23
  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