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:
Ledit séquenceur efface les événements après les avoir consommés:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 static void Sequencer::AddEvent( Event* ); // qui sera appelé comme suit (normalement): Sequencer::AddEvent( new MonEvent( mes_params ) );
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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 void Sequencer::OnTick() { pour tous les events qu'il faut exécuter: execute event delete event }
Et donc, de temps en temps, je vais avoir des trucs du style:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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... };
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).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void UnTruc::FaitQuelqueChose() { // fait quelque chose Sequencer::AddEvent( mon_event ); }
Donc, la première solution consiste à copier le pointeur lors de l'ajout:
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é.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Sequencer::AddEvent( new Event( mon_event ) );
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