Je viens de me faire griller par un bogue qui est en partie dû à mon manque de compréhension, et en partie dû à ce que je pense être une conception sous-optimale dans notre base de code. Je suis curieux de savoir comment ma solution de 5 minutes peut être améliorée.
Nous utilisons des objets de type ref-count, où nous avons AddRef() et Release() sur les objets de ces classes. Un objet particulier est dérivé de l'objet ref-count, mais une fonction courante pour obtenir une instance de ces objets (GetExisting) cache un AddRef() en son sein sans le signaler. Cela nécessite de faire un Release à la fin du bloc fonctionnel pour libérer la référence cachée, mais un développeur qui n'a pas inspecté l'implémentation de GetExisting() ne le sait pas, et quelqu'un qui oublie d'ajouter un Release à la fin de la fonction (disons, pendant une course folle de correction de bogues) perd des objets. Ceci, bien sûr, était ma brûlure.
void SomeFunction(ProgramStateInfo *P)
{
ThreadClass *thread = ThreadClass::GetExisting( P );
// some code goes here
bool result = UseThreadSomehow(thread);
// some code goes here
thread->Release(); // Need to do this because GetExisting() calls AddRef()
}
J'ai donc écrit une petite classe pour éviter le recours à la fonction Release() à la fin de ces fonctions.
class ThreadContainer
{
private:
ThreadClass *m_T;
public:
ThreadContainer(Thread *T){ m_T = T; }
~ThreadContainer() { if(m_T) m_T->Release(); }
ThreadClass * Thread() const { return m_T; }
};
Pour que maintenant je puisse juste faire ça :
void SomeFunction(ProgramStateInfo *P)
{
ThreadContainer ThreadC(ThreadClass::GetExisting( P ));
// some code goes here
bool result = UseThreadSomehow(ThreadC.Thread());
// some code goes here
// Automagic Release() in ThreadC Destructor!!!
}
Ce que je n'aime pas, c'est que pour accéder au pointeur de fil, je dois appeler une fonction membre de ThreadContainer, Thread(). Existe-t-il un moyen astucieux de nettoyer cela afin que la syntaxe soit plus jolie, ou est-ce que cela obscurcirait la signification du conteneur et introduirait de nouveaux problèmes pour les développeurs qui ne connaissent pas le code ?
Merci.