Bonjour à tous .
Tout d'abbord une question d'ordre général, je cherche à gérer les problème de mémoire qui peuvent survenir dans une application, pour cela j'ai vu globalement 2 méthodes :
- surcharge des new / delete [ j'ai du mal a totu assimilé à ce niveau ... et j'ai du mal à mettre vraiment le nez dedans ]
- création d'un classe mère avec un conteneur static de tou les objets, le tout agrémenter de smart ptr .
Je me demande si je ne peux pas m'en sortir, uniquement a l'aide de smart ptr , de cette facons, plus de problème avec les new/delete, et le reste du code ne doit normalment pas posé de problème, la destruction des objet étant automatique ... je me trompe ?
J'attend vos conseils
Sinon, je commence à peine à manipuler les smart ptr , et j'essaie de me faire la main dessus, et je me heurte à un petit problème : je veux implémenter une version simple ( dans le simple but de tester ) d'une manager de texture .
Celui-ci possède une simple fonction Get(), qui va :
- charge la texture associé à l'ID passé en argument si ce n'est déja fait
- retourner un pointeur vers la texture quoi qu'il arrive
Ca marche, pas de problème, et mes texture sont détruite automatiquement quand on TextureManager est détruit .
Le problème est qu'il manque une foncitonalité que je n'arrive pas à coder :
Quand tout les objets utilisant une texture donné sont détruit, la texture doit être détruite , hors dans mon code ce n'est pas possible, car je stocke mes texture dans une map qui associe un entier, avec un smart ptr vers la texture, donc quoi qu'il arrive , jusqu'à la mort de mon manager, il restera un smart ptr qui pointera vers chaqu'une de mes textures :
voila le code minimal qui reproduit ca :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 class CItem { public : boost::shared_ptr<CTexture> T ; };
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 class CTexture { public : CTexture(int ID_t) { ID = ID_t ; std::cout << "Texture " << ID << " is created" << std::endl ; } ~CTexture() { std::cout << "Texture " << ID << " is destroyed" << std::endl ; } private : int ID ; };
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
17 #include <vector> #include <map> class CTextureManager { public: boost::shared_ptr<CTexture> Get(int ID) { if ( Map_Texture.find(ID) == Map_Texture.end() ) { Map_Texture[ID] = boost::shared_ptr<CTexture>( new CTexture(ID)) ; } return Map_Texture[ID] ; } private : std::map <int, boost::shared_ptr<CTexture> > Map_Texture ; };
Le fichier output :
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
17
18
19
20 int main(int argc, char *argv[]) { SDL_Init(0); CTextureManager M ; CItem I; { CItem I1,I2 ; I.T = M.Get(0); I1.T = M.Get(1); I2.T = M.Get(1) ; } std::cout << " ------------------------ " << std::endl ; SDL_Quit(); return 0; }
J'aimerai que la texture 1 soit détruite juste après l'acolade fermente ( donc aprés le "----" dans l'output ) .Texture 0 is created
Texture 1 is created
------------------------
Texture 1 is destroyed
Texture 0 is destroyed
Merci .
Partager