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

  FORUM HardWare.fr
  Programmation
  C++

  [C++] classe array 1d et delete[]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] classe array 1d et delete[]

n°1942665
Vel-Ryphon
Posté le 20-11-2009 à 09:30:44  profilanswer
 

Bonjour à tous,
 
Je galère sur un problème de gestion de mémoire et je n'arrive pas à trouver la solution.
 
J'ai une classe Array_1D, qui remplit grosso modo le rôle de la classe standard Vector.
Dans cette classe qui est un template, j'ai donc un pointeur vers le bloc mémoire contenant l'ensemble des données :
 

Code :
  1. template <class type>
  2. class      Array_1D
  3. {
  4. private:
  5.    int  number_of_elements;
  6.    int  last_element;
  7.    type* array;
  8.       .............


 
Pour rajouter des éléments dans cette classe de stockage, j'ai une fonction extend_array, prenant en paramètre le nombre d'élément à ajouter :

Code :
  1. template <class type>
  2. type&
  3. Array_1D<type>::extend_array(const int& number_of_elements_to_add)
  4. {
  5.    int  new_number_of_elements =number_of_elements + number_of_elements_to_add;
  6.  if(new_number_of_elements > 0)
  7.  {
  8.   if(array != NULL)
  9.   {
  10.    type* buffer     =new type[new_number_of_elements];
  11.          memcpy(buffer, array, sizeof(type) * number_of_elements);
  12.      delete[]   array;
  13.      array    =buffer;
  14.   }
  15.   else
  16.      array    =new type[new_number_of_elements];
  17.  }
  18.      number_of_elements =new_number_of_elements;
  19.      last_element  =number_of_elements - 1;
  20.      return    array[last_element];
  21. }


 
Le problème vient du delete[].  Il fait planter mon appli. Si je le mets en commentaire ça fonctionne, mais bien évidemment j'ai de grosses fuites mémoire.
Je ne comprends pas d'où vient le problème, auriez-vous une idée ?
 
Je vous remercie par avance !!

mood
Publicité
Posté le 20-11-2009 à 09:30:44  profilanswer
 

n°1942673
Un Program​meur
Posté le 20-11-2009 à 09:57:42  profilanswer
 

1/ Pourquoi ne pas utiliser vector?
2/ Les constructeurs de copie qui ne sont pas executes, ca peut expliquer beaucoup
3/ Un probleme de crash avec un delete, c'est souvent une corruption et celle-ci peut avoir sa cause a peut pres n'importe quand avant.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°1942674
Vel-Ryphon
Posté le 20-11-2009 à 10:04:52  profilanswer
 

Il est vrai que j'aurai pu utiliser vector, mais pour plusieurs raisons j'ai préféré codé ma propre classe.
 
Pourrais-tu expliciter la notion de constructeur de copy dans le cas qui m'intéresse ? Tu parles de l'instruction memcpy ?


---------------
http://www.ryphon-mechanics.com
n°1942680
Vel-Ryphon
Posté le 20-11-2009 à 10:10:31  profilanswer
 

Si je remplace memcpy par une boucle qui copie les éléments 1 par 1, ça fonctionne :
 

Code :
  1. for(int i = 0;i < number_of_elements;i++)
  2.     buffer[i] =array[i];


 
Je ne comprends pas pourquoi cela fonctionne mieux, d'autant plus que l'utiliser de memcpy permet d'optimiser  les performances, et c'est ce que je recherche...


---------------
http://www.ryphon-mechanics.com
n°1942697
chewif
Posté le 20-11-2009 à 10:22:41  profilanswer
 

*memcpy copie des tas d octets
*buffer[i] = array[i] appelle le constructeur type( const type& ) ...  du coup c est ce que tu dois faire. Si tu veux de meilleures perfs ensuite tu peux envisager de specialiser ton template pour certains types ou le memcpy ne pose pas probleme
*utilise vector

Message cité 1 fois
Message édité par chewif le 20-11-2009 à 10:23:43
n°1942743
Joel F
Real men use unique_ptr
Posté le 20-11-2009 à 11:43:00  profilanswer
 

Vel-Ryphon a écrit :

Il est vrai que j'aurai pu utiliser vector, mais pour plusieurs raisons j'ai préféré codé ma propre classe.


Par plusieurs tu veux parler du fait que ta classe sera bugguée, moins performante, moins générique et moins interoperabel que std::vector ? ou bien du fait que tu n'as que ça à faire de ton temps de reinventer l'eau froide ? ou bien ta boite est un de ces dinosaures qui crois la STL est mal faite ?

Message cité 1 fois
Message édité par Joel F le 20-11-2009 à 11:44:33
n°1942745
Joel F
Real men use unique_ptr
Posté le 20-11-2009 à 11:45:04  profilanswer
 

chewif a écrit :


*buffer[i] = array[i] appelle le constructeur type( const type& ) ...  du coup c est ce que tu dois faire. Si tu veux de meilleures perfs ensuite tu peux envisager de specialiser ton template pour certains types ou le memcpy ne pose pas probleme


 
std::copy fait deja cette optimisation :)

n°1942795
Vel-Ryphon
Posté le 20-11-2009 à 13:57:23  profilanswer
 

Joel F a écrit :


Par plusieurs tu veux parler du fait que ta classe sera bugguée, moins performante, moins générique et moins interoperabel que std::vector ? ou bien du fait que tu n'as que ça à faire de ton temps de reinventer l'eau froide ? ou bien ta boite est un de ces dinosaures qui crois la STL est mal faite ?


 
parce-que je programme pour mon loisir, que j'aime programmer même des trucs qui ont déjà été fait, et que j'aime bien me casser les dents sur un problème, car une fois résolu j'ai appris des choses :-).


---------------
http://www.ryphon-mechanics.com
n°1942810
Joel F
Real men use unique_ptr
Posté le 20-11-2009 à 14:24:57  profilanswer
 

sauf que la c'est contre-productif mais c'est pas grave ...

n°1942852
Vel-Ryphon
Posté le 20-11-2009 à 16:06:57  profilanswer
 

Joel F a écrit :

sauf que la c'est contre-productif mais c'est pas grave ...


 
Pourquoi être toujours négatif ? Ma question ne portait pas sur la pertinence de ma classe, mais sur un point technique précis d'une méthode. Je ne cherche pas à être productif dans mes loisirs, je cherche à me faire plaisir, c'est le but de tout loisir.


---------------
http://www.ryphon-mechanics.com
mood
Publicité
Posté le 20-11-2009 à 16:06:57  profilanswer
 

n°1942883
Un Program​meur
Posté le 20-11-2009 à 17:04:50  profilanswer
 

Le probleme que je vois -- encore plus que de perdre ton temps a reinventer la roue -- c'est que tu sautes les etapes.  Ecrire des templates mais ne pas comprendre directement quel est le fond du probleme quand on t'indique que tu n'utilises pas les constructeurs de copie, indique pour moi que tu ne maitrises pas encore les bases.  Ecrire des templates -- reinventant la roue ou non -- est premature.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°1942891
Vel-Ryphon
Posté le 20-11-2009 à 17:16:54  profilanswer
 

Toujours est-il que je ne comprends pas pourquoi le memcpy pose problème, puisqu'à partir du moment où mon array est alloué avec un new[], la mémoire est forcément contigue, et de ce fait le delete[] ferait son office correctement...


---------------
http://www.ryphon-mechanics.com
n°1942901
Joel F
Real men use unique_ptr
Posté le 20-11-2009 à 17:55:16  profilanswer
 

non. Si tu fais un tableau d'objet, ca copie doit copier les objets en appelant leur constructeur de copie qui peuvent avoir des effets de bords. Si tu copie des objets bits à bits, tu t'expose à de sacrée deconvenue.
 
Exemple, fait un array<array> et tu verras :€

n°1942922
Vel-Ryphon
Posté le 20-11-2009 à 18:47:17  profilanswer
 

D'accord, c'est plus clair maintenant. Merci pour ces explications, et dommage que l'optimisation que le memcpy m'aurait apportée ne fonctionne pas :(.


---------------
http://www.ryphon-mechanics.com
n°1942939
Joel F
Real men use unique_ptr
Posté le 20-11-2009 à 19:51:06  profilanswer
 

elle fonctionnera si tu utilises std::copy ... car elle se charge de faire ça
 
Et sidenote, tu te fout des perfs quant que t'as pas bencher :o

n°1942948
Lavock
Posté le 20-11-2009 à 20:12:04  profilanswer
 

Hum, je dirai qu'en plus, c'est pas du C que tu fais, mais du C++. Un tableau alloué par new "contient" des information caché (bon c'est pas vraiment lui qui les as), qui fait que tu n'as pas a faire de Delete[n] mais juste un Delete[]. Je pense que dans ton cas il cherche désespérément à desalloué le tout premier tableau que tu as fais...  
 
En plus tu as déplacé des éléments sans leur signifié qu'ils étaient déplacer...
 
Mais je suis vraiment pas sur de ça. Regarde un coup le désassemble ou les logs...

n°1942949
Joel F
Real men use unique_ptr
Posté le 20-11-2009 à 20:16:03  profilanswer
 

non delete[] est la forme correcte pr la desallocation d'un tableau alloué par new ...
et y a qu'en russie stalinienne ou on desassemble son code pour chercher des erreurs ...


Message édité par Joel F le 20-11-2009 à 20:16:23
n°1942950
Lavock
Posté le 20-11-2009 à 20:19:58  profilanswer
 

Erf, et on bazarde pas des données en écrasant un tableau dynamique comme ça ?

n°1942960
Joel F
Real men use unique_ptr
Posté le 20-11-2009 à 20:52:05  profilanswer
 

euh non, lis la doc de delete[]


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

  [C++] classe array 1d et delete[]

 

Sujets relatifs
[C++] Map statique dans une classeaddition de caracteres en C ...
[Architecture] Utiliser une classe en dev / test et une autre en prod[C] [resolu] lecture matrice alloué dynamiquement
{C++} Tableau de structure[C/C++] Coût d'une allocation mémoire
[C#] Héritage de Template (généric)programmation wifi linux en C
Notation romaine décroissante en langage C 
Plus de sujets relatifs à : [C++] classe array 1d et delete[]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR