Hoy! \o
Après avoir expérimenté des fuites de mémoires dans mon jeu, je tente de passer de mes listes de pointeur à des boost::ptr_list. La conversion se fait doucement, mais j'ai un soucis que je vais tenter d'expliquer :
J'ai deux classe A et B. A possède une boost::ptr_list<B> et dispose de deux fonctions public qui permettent d'ajouter et retirer des B de ma liste. Ca se présente comme ça :
B elle possède un pointeur vers le A qui la contiens et une fonction Calculate() appelée régulièrement. Calculate peut, sous certaines conditions, appeler le remove de A pour supprimer l'élement en question. Elle se présente comme ça :
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 class A { boost::ptr_list<B> liste; public: void Add(B *b) { b->SetA(this); liste.push_back(b); } void Remove(B *b) { ??? } };
Je n'ai pas eu de mal à changer mes std::list contre les ptr_list SAUF pour la fonction Remove().
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 class B { A *my_a; public: void SetA(A *a) { my_a = a; } void Calculate() { ... my_a->Remove(this); } };
Avec la std::list, j'avais simplement besoin d'utiliser le pointeur de l'objet et faire un appel a liste.remove() de cette manière :
Mais depuis le passage en ptr_list, plus moyen. La fonction ptr_list::remove est a prioris private, la fonction ptr_list::erase prend un iterateur et je ne trouve pas quel fonctions utiliser pour pouvoir retirer mon élement en l'identifiant par son pointeur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 void A::Remove(B *b) { liste.remove(b); delete b; }
L'idée serait de faire un boucle pour tester l'adresse de chaque élement ( par un if(&(*it) == b) ), mais j'ai un doute quand à sa fiabilité. A savoir qu'un B n'est inséré dans la liste qu'une fois par clonage via le Add(B *).
Donc voila ma question : Comment pourrais-je supprimer mon élement en indiquant son pointeur avec la ptr_list de manière simple et fiable?
La solution du parcours est-elle malgrés tout efficace?
Partager