Bonjour à tous,
J'ai développez il y a quelques temps une classe de smart pointer de type :J'ai déjà eu l'occasion de faire quelques tests, il "semblerait" qu'ils soient fonctionnels. J'ai pu lire que dans mon cas de figure seul les références circulaires empêchées les smarts pointers de fonctionner. Or j'ai découvert un bug plutôt "étrange" (tout du moins incompris de moi). Voilà le détail de ce qui se passe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 template <class T> class CSmartPointer { T *m_Pointer; int *m_Counter; };Il faut savoir que CNodePtr est donc de type CSmartPointer<CNode> (CNode n'étant pas important ici). m_Root est initialisé a NULL par défaut et le compteur à 1. Maitenant dans la fonction ReadScene :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 class CSceneManager{ //... bool ReadScene(std::string const &Filename); bool ReadScene(CNodePtr Root); CNodePtr m_Root; }Une petite explication s'impose, Loader est une instance de classe permettant de charger des scènes, la fonction LoadScene renvoie un CNodePtr correspondant à la scène chargée. Et enfin :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 bool CSceneManager::ReadScene(std::string const &Filename) { //... // Load the scene : CNodePtr NodeTmp = Loader->LoadScene(Filename); // compteur à 1!! bool b = ReadScene(NodeTmp); // compteur à 2 return b; // compteur à 0 }Résultat l'objet est détruit... et je bloc dessus depuis un bon moment déjà alors que ça à l'air idiot (mais bon c'est toujours comme ça)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 bool CSceneManager::ReadScene(CNodePtr Root) { //... m_Root = Root; //compteur à 3 return true; }
Si vous avez besoin de plus de code (CSmartPointer, fonctions...) n'hésitez pas à demander...
Merci d'avance et bonne fin de journée
Partager