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 :
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)
	{
		???
	}
};
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 B
{
	A *my_a;
public:
	void SetA(A *a)
	{
		my_a = a;
	}
 
	void Calculate()
	{
		...
		my_a->Remove(this);
	}
};
Je n'ai pas eu de mal à changer mes std::list contre les ptr_list SAUF pour la fonction Remove().

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 :
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;
}
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.

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?