Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
4751 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  fuite de mémoire!

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

fuite de mémoire!

n°1177389
ptitchep
Posté le 16-08-2005 à 20:05:34  profilanswer
 

Salut!
Je programme un jeu de combat avec OpenGl et Glut et lorsque j'appelle cette fonction, le gestionnaire des taches de windows m'indique que la mémoire utilisée par mon processus grimpe en flèche (je passe environ de 50 Mo à 120 Mo):
 

Code :
  1. using namespace std;
  2. #include <iostream>
  3. #include <direct.h>
  4. #include "baston.hpp"
  5. extern GLubyte tex_ciel[2048*2048*4], tex_sol[2048*2048*4];
  6. extern GLubyte tex_devant[1024*1024*4], tex_derriere[1024*1024*4];
  7. extern GLubyte tex_droite[1024*1024*4],tex_gauche[1024*1024*4];
  8. extern GLuint textures_skybox[6];
  9. extern int nb_mondes;
  10. extern int monde_en_cours;
  11. //------------------------------------------------------------------------------
  12. //-------------------------INITIALISATION DE LA SKYBOX--------------------------
  13. //------------------------------------------------------------------------------
  14. void init_skybox()
  15. {
  16.     int i,j,k;
  17.     FILE *fich;
  18.     char nomonde[3];
  19.     char monde[15];
  20.    
  21.     GLubyte en_tete[37];
  22.    
  23.     glEnable(GL_TEXTURE_2D);     
  24.     glGenTextures(6,textures_skybox);
  25.    
  26.    
  27.     //Répertoires pour les textures
  28.     strcpy(monde,"monde" );
  29.     to_char(monde_en_cours,monde+5);//ajoute le numéro du monde à la fin de monde
  30.    
  31.  
  32.     //Choix du répertoire en cours
  33.     chdir(monde);
  34.      
  35.     //ciel:
  36.     fich=fopen("ciel.bmp","rb" ); 
  37.     if(fich==NULL) exit(0);
  38.    
  39.     fread (en_tete,1,54,fich);
  40.    
  41.     for(i=0;i<2048;i++)
  42.     {
  43.         for(j=0;j<2048;j++)
  44.         {
  45.             fread(&tex_ciel[(i*2048+j)*4+2],sizeof(GLubyte),1,fich);
  46.             fread(&tex_ciel[(i*2048+j)*4+1],sizeof(GLubyte),1,fich);
  47.             fread(&tex_ciel[(i*2048+j)*4+0],sizeof(GLubyte),1,fich);
  48.             tex_ciel[(i*2048+j)*4+3]=255;
  49.         }
  50.     }     
  51.     glBindTexture(GL_TEXTURE_2D,textures_skybox[0]);
  52.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  53.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  54.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT );
  55.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT );
  56.     glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,2048,2048,0,GL_RGBA,GL_UNSIGNED_BYTE,tex_ciel);
  57.    
  58.     //sol:
  59.     fich=fopen("sol.bmp","rb" );
  60.     if(fich==NULL) exit(0);
  61.    
  62.     fread (en_tete,1,54,fich);
  63.    
  64.     for(i=0;i<2048;i++)
  65.     {
  66.         for(j=0;j<2048;j++)
  67.         {
  68.             fread(&tex_sol[(i*2048+j)*4+2],sizeof(GLubyte),1,fich);
  69.             fread(&tex_sol[(i*2048+j)*4+1],sizeof(GLubyte),1,fich);
  70.             fread(&tex_sol[(i*2048+j)*4+0],sizeof(GLubyte),1,fich);
  71.             tex_sol[(i*2048+j)*4+3]=255;
  72.         }
  73.     }
  74.    
  75.     fclose (fich); 
  76.     glBindTexture(GL_TEXTURE_2D,textures_skybox[1]);
  77.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  78.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  79.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT );
  80.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT );
  81.     glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,2048,2048,0,GL_RGBA,GL_UNSIGNED_BYTE,tex_sol);
  82.    
  83.     //derriere:
  84.     fich=fopen("derriere.bmp","rb" );
  85.     if(fich==NULL) exit(0);
  86.    
  87.     fread (en_tete,1,54,fich);
  88.    
  89.     for(i=0;i<1024;i++)
  90.     {
  91.         for(j=0;j<1024;j++)
  92.         {
  93.             fread(&tex_derriere[(i*1024+j)*4+2],sizeof(GLubyte),1,fich);
  94.             fread(&tex_derriere[(i*1024+j)*4+1],sizeof(GLubyte),1,fich);
  95.             fread(&tex_derriere[(i*1024+j)*4+0],sizeof(GLubyte),1,fich);
  96.             tex_derriere[(i*1024+j)*4+3]=255;
  97.         }
  98.     }
  99.    
  100.     fclose (fich); 
  101.     glBindTexture(GL_TEXTURE_2D,textures_skybox[2]);
  102.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  103.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  104.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT );
  105.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT );
  106.     glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,1024,1024,0,GL_RGBA,GL_UNSIGNED_BYTE,tex_derriere);
  107.    
  108.     //devant:
  109.     fich=fopen("devant.bmp","rb" );
  110.     if(fich==NULL) exit(0);
  111.    
  112.     fread (en_tete,1,54,fich);
  113.    
  114.     for(i=0;i<1024;i++)
  115.     {
  116.         for(j=0;j<1024;j++)
  117.         {
  118.             fread(&tex_devant[(i*1024+j)*4+2],sizeof(GLubyte),1,fich);
  119.             fread(&tex_devant[(i*1024+j)*4+1],sizeof(GLubyte),1,fich);
  120.             fread(&tex_devant[(i*1024+j)*4+0],sizeof(GLubyte),1,fich);
  121.             tex_devant[(i*1024+j)*4+3]=255;
  122.         }
  123.     }
  124.    
  125.     fclose (fich); 
  126.     glBindTexture(GL_TEXTURE_2D,textures_skybox[3]);
  127.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  128.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  129.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT );
  130.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT );
  131.     glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,1024,1024,0,GL_RGBA,GL_UNSIGNED_BYTE,tex_devant);
  132.    
  133.     //gauche:
  134.     fich=fopen("gauche.bmp","rb" );
  135.     if(fich==NULL) exit(0);
  136.    
  137.     fread (en_tete,1,54,fich);
  138.    
  139.     for(i=0;i<1024;i++)
  140.     {
  141.         for(j=0;j<1024;j++)
  142.         {
  143.             fread(&tex_gauche[(i*1024+j)*4+2],sizeof(GLubyte),1,fich);
  144.             fread(&tex_gauche[(i*1024+j)*4+1],sizeof(GLubyte),1,fich);
  145.             fread(&tex_gauche[(i*1024+j)*4+0],sizeof(GLubyte),1,fich);
  146.             tex_gauche[(i*1024+j)*4+3]=255;
  147.         }
  148.     }
  149.    
  150.     fclose (fich); 
  151.     glBindTexture(GL_TEXTURE_2D,textures_skybox[4]);
  152.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  153.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  154.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT );
  155.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT );
  156.     glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,1024,1024,0,GL_RGBA,GL_UNSIGNED_BYTE,tex_gauche); 
  157.    
  158.     //droite:
  159.     fich=fopen("droite.bmp","rb" );
  160.     if(fich==NULL) exit(0);
  161.    
  162.     fread (en_tete,1,54,fich);
  163.    
  164.     for(i=0;i<1024;i++)
  165.     {
  166.         for(j=0;j<1024;j++)
  167.         {
  168.             fread(&tex_droite[(i*1024+j)*4+2],sizeof(GLubyte),1,fich);
  169.             fread(&tex_droite[(i*1024+j)*4+1],sizeof(GLubyte),1,fich);
  170.             fread(&tex_droite[(i*1024+j)*4+0],sizeof(GLubyte),1,fich);
  171.             tex_droite[(i*1024+j)*4+3]=255;
  172.         }
  173.     }
  174.    
  175.     fclose (fich); 
  176.     glBindTexture(GL_TEXTURE_2D,textures_skybox[5]);
  177.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  178.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  179.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT );
  180.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT );
  181.     glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,1024,1024,0,GL_RGBA,GL_UNSIGNED_BYTE,tex_droite);
  182.    
  183.    
  184.     chdir(".." );
  185. }


 
Pourtant je n'ai aucune allocation dynamique puisque mes tableaux ont des tailles fixes et sont déclarés variables globales dans le .cpp principal
 
merci


---------------
deluser --remove-home ptitchep
mood
Publicité
Posté le 16-08-2005 à 20:05:34  profilanswer
 

n°1177428
Taz
bisounours-codeur
Posté le 16-08-2005 à 20:47:35  profilanswer
 

#  for(i=0;i<2048;i++)
#     {
#         for(j=0;j<2048;j++)
#         {
#             fread(&tex_ciel[(i*2048+j)*4+2],sizeof(GLubyte),1,fich);
#             fread(&tex_ciel[(i*2048+j)*4+1],sizeof(GLubyte),1,fich);
#             fread(&tex_ciel[(i*2048+j)*4+0],sizeof(GLubyte),1,fich);
#             tex_ciel[(i*2048+j)*4+3]=255;
#         }
#     }        
 
 
c'est idiot tout ça, tu veux faire tout en un seul fread. idem pour le reste. beurk les variables globales aussi grosse. avec des BMP, tu peux meme faire du mappage mémoire directe :)

n°1177430
Taz
bisounours-codeur
Posté le 16-08-2005 à 20:49:19  profilanswer
 

GLubyte en_tete[37];
 
...
 
 fread (en_tete,1,54,fich);
 
 
perdu

n°1177431
olivthill
Posté le 16-08-2005 à 20:50:55  profilanswer
 

Je ne sais pas si les lignes suivantes sont la cause du problème, mais en tous cas, il y a là un petit bug.

  GLubyte en_tete[37];  
 ...
    fread (en_tete,1,54,fich);  


Il faudrait que "en_tete" soit déclaré avec au moins 54 octets, sinon il y a un débordement sur les zones mémoires voisines. :)
 
Edit : T'es trop rapide, Taz !


Message édité par olivthill le 16-08-2005 à 20:52:09
n°1177786
retrox
Posté le 17-08-2005 à 12:13:08  profilanswer
 

Sinon une fois que tu as instancié tes textures, ça sert a rien de garder une copie des images. Donc tu peux abandonner tes gros tableaux globaux, utiliser un tableau dynamique assez grand (pour réutiliser le meme pour toutes les faces) au moment du loading et le virer proprement à la fin du Init.

n°1177861
ptitchep
Posté le 17-08-2005 à 13:47:45  profilanswer
 

Ok je croyais que openGl se servait de mes tableaux pour les textures par la suite.
Pour le fread 54 dans un tableau de 37  c'est une petite erreur c'est 0x37 dsl. (j'ai compté l'en-tete dans mon éditeur hexa et forcément j'ai l'offset en hexa...
Tout s'arrange merci. En fait je ne savais pas qu'OpenGl chargait mes textures en mem et du coup je me souçiais pas des textures. Erreur fatale, il manquait:
glDeleteTextures(6,textures_skybox);
d'où la fuite de memoire.
Merci bien!!!


---------------
deluser --remove-home ptitchep

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  fuite de mémoire!

 

Sujets relatifs
Problème complexe : flush de la memoire tampon d'un JFileChooserQuestion sur la gestion mémoire
débordement de la mémoireFreeImage liberation memoire
Problème de mémoire...fuite mémoire
[Visual Basic] utilisation d'un dll C++ && fuite memoireAPI C de MySQL: fuite de mémoire
c coi une fuite de mémoire ?[C - Visual Studio] Detection de fuite mémoire
Plus de sujets relatifs à : fuite de mémoire!


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)