Desallocation d'un tableau a trois dimension

Desallocation d'un tableau a trois dimension - C++ - Programmation

Marsh Posté le 17-04-2005 à 17:51:13    

Salut,
J'ai un petit soucis au niveau de la désallocation d'un tableau a trois dimension.
J'initialise mon tableau comme ceci :
 
tableauUVFaces = new float**[nbUVFaces];
for (i=0; i < nbUVFaces; i++) {
   tableauUVFaces[i] = new float*[3];
   for (j=0; j < 3; j++) {
      tableauUVFaces[i][j] = new float[3];
   }
}
 
et ensuite je l'efface comme cela :
delete[] tableauUVFaces;
 
Cela ne me donne aucune erreur mais je me demande si ca me libere bien ainsi tout la mémoire.
Si quelqu'un pouvait m'éclairer à se sujet, je lui en serais très reconnaissant...
Je n'ai pas trouvé de réponse à ce sujet sur d'autre posts mais j'ai peut etre mal cherché...
Merci à celui qui me répondra.
+++

Reply

Marsh Posté le 17-04-2005 à 17:51:13   

Reply

Marsh Posté le 17-04-2005 à 17:52:33    

bin non, pour un new tu dois avoir le delete associé, donc vala
 
toi tu fais un importeur de données 3d [:god]


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 17-04-2005 à 17:54:19    

Tu dois faire autant de delete que de new si tu veux libérer toute la mémoire.
 
Arf trop tard ;)


Message édité par Tarabiscote le 17-04-2005 à 17:55:21
Reply

Marsh Posté le 17-04-2005 à 18:06:29    

oh le massacres :/
 
tu veux pas au moins utiliser une banale
 
struct XYZ { float x; float y, float z };
 
pour limiter la fragmentation mémoire ?

Reply

Marsh Posté le 19-04-2005 à 02:06:31    

Taz a écrit :

oh le massacres :/
 
tu veux pas au moins utiliser une banale
 
struct XYZ { float x; float y, float z };
 
pour limiter la fragmentation mémoire ?


 
Je comprend ce que tu veux dire mais tu n'es pas assez precis il me semble, car
"new float[3]" est identique à "new XYZ" en ce qui concerne la fragmentation du moins.
 
le mieux dans ce cas pour eviter la fragmentation est ceci
 

Code :
  1. typedef float Matrix3x3[3][3];
  2. void function()
  3. {
  4.    // l'allocation ce fait comme ceci
  5.    Matrix3x3* tableauUVFaces = new  Matrix3x3[nbUVFaces];
  6.    // l'acces au differentes cellules est indexé comme ceci
  7.    for (int i = 0; i < nbUVFaces; i++)
  8.      for(int j = 0; j < 3; j++)
  9.        for(int k = 0; k < 3; k++)
  10.          tableauUVFaces[i][j][k] = f(i,j,k);
  11.   // la liberation de la memoire ce fait comme ceci.  
  12.   delete tableauUVFaces;
  13. }


Message édité par maxmoi_la le 19-04-2005 à 02:10:00
Reply

Marsh Posté le 19-04-2005 à 08:24:47    

Je suis en effet en train de réaliser un importeur de fichier ase (3ds au format ascii) pour mon projet de master premiere annee. Je dois en fait faire un salon de discussion en 3d.
J'avais pensé aux structs mais je préfère utiliser un tableau pour rendre plus simple l'utilisation des commandes opengl. Par exemple, glVexter3fv( tableau3 );
Je vais essayer la solution de maxmoi_la.
Merci pour toutes vos réponses.
(^-^)

Reply

Marsh Posté le 19-04-2005 à 08:39:22    

glVertexMachin, c'est le mal
 
regarde plutot au moins du coté des glArray ou chaipuquoi


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 19-04-2005 à 09:03:44    

non c'est pas pareil, mais bon, je crois bien que t'es à des centaines d'années lumières de ces problèmes de fragmentation mémoire ... quel massacre

Reply

Marsh Posté le 19-04-2005 à 09:04:29    

d'ailleurs, je suis con, nul besoin de struct, tu peux allouer d'un coup N tableau de 3 éléments.

Reply

Marsh Posté le 19-04-2005 à 09:13:14    

LoL, c'est vrai pour les glVertex mais j'utilise glCallList et du coup ca commence a devenir bien compliqué avec les glArray. Faut que je fasses une version qui marche et j'essayerai apres d'optimiser...
Sinon j'ai fait un delete[] tableauUVFaces.
 
http://drouet.aurelien.free.fr/PSTL/

Reply

Marsh Posté le 19-04-2005 à 09:13:14   

Reply

Marsh Posté le 19-04-2005 à 09:29:32    

coucou tout le monde j'ai un petit doute pour supprimer le tableau de la mémoire, ca serais pas plutot du genre :  
 
<code>
for(int i=0;i<nbUVFaces;i++)
  for(int j=0;j<3;j++)
    for(int k=0;k<3;k++)
      free(tableauUVFaces[i][j][k]);
</code>
 
c'est peut etre pas ca mais c'est juste pour savoir

Reply

Marsh Posté le 19-04-2005 à 10:05:58    

ignoble
 
 

Code :
  1. #include <cstddef>
  2. #include <new>
  3. #ifdef DEBUG
  4. #include <iostream>
  5. #endif
  6. template<typename T>
  7. T** make(size_t d1, size_t d2)
  8. {
  9.   T **matrix;
  10.   unsigned char *storage;
  11.   size_t header_size, data_size;
  12.   header_size = d1 * sizeof(T*);
  13.   data_size   = d1 * d2 * sizeof(T);
  14.   storage = new unsigned char[header_size + data_size];
  15. #ifdef DEBUG
  16.   std::cout << "Allocated " << (header_size + data_size) << "B at "
  17.     << static_cast<void*>(storage) << '\n'
  18.     << "header size = " << header_size << "B \n"
  19.     << "data_size   = " << data_size << "B \n";
  20. #endif
  21.   matrix = new (storage) T*[d1];;
  22.   for(size_t i = 0; i < d1; ++i)
  23.     {
  24.       size_t offset = 0;
  25.       offset += header_size;
  26.       offset += d2 * i * sizeof(T);
  27. #ifdef DEBUG
  28.   std::cout << "Allocated " << (d2 * sizeof(T)) << "B at "
  29.     << static_cast<void*>(storage + offset) << '\n';
  30. #endif
  31.       matrix[i] = new (storage + offset) T[d2];
  32.     }
  33.   return matrix;
  34. }
  35. template<typename M, typename E>
  36. void fill3(M &m, size_t x, size_t y, size_t z, const E &e)
  37. {
  38.   for(size_t i = 0; i < x; ++i)
  39.     for(size_t j = 0; j < y; ++j)
  40.       for(size_t k = 0; k < z; ++k)
  41. m[i][j][k] = e;
  42. }
  43. template<typename M, typename N>
  44. bool equal3(const M &m, const N &n, size_t x, size_t y, size_t z)
  45. {
  46.   for(size_t i = 0; i < x; ++i)
  47.     for(size_t j = 0; j < y; ++j)
  48.       for(size_t k = 0; k < z; ++k) {
  49. if(m[i][j][k] != n[i][j][k]) return false;
  50.       }
  51.   return true;
  52. }
  53. int main()
  54. {
  55.   const size_t X = 10, Y = 20, Z = 30;
  56.   typedef double Inner[Z];
  57.   Inner **m1, **m2;
  58.   m1 = new Inner*[X];
  59.   for(size_t i = 0; i < X; ++i)
  60.     m1[i] = new Inner[Y];
  61.   m2 = make<Inner>(X, Y);
  62.   fill3(m1, X, Y, Z, 3.14);
  63.   fill3(m2, X, Y, Z, 3.14);
  64.   bool eq = equal3(m1, m2, X, Y, Z);
  65.   for(size_t i = 0; i < X; ++i)
  66.     delete m1[i];
  67.   delete m1;
  68.   delete m2;
  69.   return eq;
  70. }


 
 
un petit exemple avec 2 techniques pour faire des allocations plus sympa pour la fragmentation de la mémoire.
 
1) vu que la taille des éléments interne est fixe (pour toi double[3]) et bien il faut s'en servir -> m1
2) j'avais dans un coin un truc pour allouer une matrice de manière contigüe. une matrice2D de double[3] et voilà, c'est plié.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed