Bonjour,
je sais c'est mal, mais je n'ai jamais vraiment utilisé les pointeurs intelligents. En fait je n'en avais jamais vraiment eu besoin.
Mais là je pense que je suis enfin tombé sur un cas où il serait peut-être préférable de l'utiliser.
J'ai un sequénceur qui possède une queue d'événements, événements qui sont ajoutés par pointeurs:
1 2 3 4
| static void Sequencer::AddEvent( Event* );
// qui sera appelé comme suit (normalement):
Sequencer::AddEvent( new MonEvent( mes_params ) ); |
Ledit séquenceur efface les événements après les avoir consommés:
1 2 3 4 5 6
| void Sequencer::OnTick()
{
pour tous les events qu'il faut exécuter:
execute event
delete event
} |
Or maintenant, il se trouve que je veux avoir un objet qui va déclancher un événement de temps en temps. Il aura donc un événement stocké en tant que variable membre:
1 2 3 4 5 6 7 8 9 10 11
| class UnTruc
{
private:
Event * mon_event;
public:
// constructeur
UnTruc(mes_params) : mon_event( new Event( mes_params) ) {}
// des paramètres et fonctions...
}; |
Et donc, de temps en temps, je vais avoir des trucs du style:
1 2 3 4 5
| void UnTruc::FaitQuelqueChose()
{
// fait quelque chose
Sequencer::AddEvent( mon_event );
} |
Le problème, comme vous le voyez, avec le code ci-dessus, c'est que l'événement mon_event sera effacé par le séquenceur aprés avoir été exécuté. Et donc la prochaine fois que UnTruc::FaitQuelqueChose() sera appelé, mon_event sera invalide et j'aurai un comportement indéterminé (avec, le plus probablement, un zoli crash).
Donc, la première solution consiste à copier le pointeur lors de l'ajout:
Sequencer::AddEvent( new Event( mon_event ) );
Mais ça implique, entre autres, qu'il faut s'assurer que cette copie se passe bien, ce qu'il n'est pas forcément assuré.
Et en fait, de toute façon le problème c'est que en fonctionnant ainsi, je suis constamment exposé à cette erreur (ajouter un événement qui va se faire delete par le séquenceur) au cours de mon developpement sur ce programme.
Ma question est donc: dans ce cas précis, serait-une bonne chose d'utiliser un smart pointer? Si oui, quel type de smart pointer?
Partager