[C++] Problème d'allocation dynamique

Problème d'allocation dynamique [C++] - C++ - Programmation

Marsh Posté le 16-12-2007 à 17:38:24    

Toujours sur mon algo de tri, j'ai un problème avec des tableaux en allocation dynanique :
 

Code :
  1. int n = 5;   // Nombre d'éléments à trier au départ
  2. while (n < 10000000)
  3. {
  4.  int *t_rapide;   // Tableau pour le tri rapide
  5.  int *t_tas;   // Tableau pour le tri par tas
  6.  int *t_trie;   // Tableau trié de sauvegarde
  7.  t_rapide = new int [n];
  8.  t_tas = new int [n+1];
  9.  t_trie = new int [n];
  10.  // instructions.....
  11.  for (int k=0; k<12; k++)
  12.    ......
  13.  // Restitution de la mémoire dynamique
  14.  delete[] t_rapide;
  15.  delete[] t_tas;
  16.  delete[] t_trie;
  17.  // Augmentation du nombre de données
  18.  n = n+50000;
  19. }


Il est bien évident que je dois supprimer les tableaux au fur et à mesure sinon ça me prends toute ma mémoire, mais ça me met un très joli message à l'execution :

Code :
  1. *** glibc detected *** ./projet: free(): invalid next size (fast): 0x0000000000603030 ***
  2. ======= Backtrace: =========
  3. /lib/libc.so.6[0x2acb308a6b0a]
  4. /lib/libc.so.6(cfree+0x8c)[0x2acb308aa6fc]
  5. ./projet[0x401a5a]
  6. /lib/libc.so.6(__libc_start_main+0xf4)[0x2acb30852b44]
  7. ./projet(__gxx_personality_v0+0x59)[0x400db9


Vous voyez d'ou ça vient ?
Merci !

Reply

Marsh Posté le 16-12-2007 à 17:38:24   

Reply

Marsh Posté le 16-12-2007 à 18:57:48    

salut
Tu as vérifié que les pointeurs étaient valides apres les new?


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

Marsh Posté le 16-12-2007 à 18:59:23    

Ca se vérifie comment ?
Je précise que si j'enlève les delete ça fonctionne, mais voilà la mémoire que ça prends au fur et à mesure !


Message édité par Fused le 16-12-2007 à 19:01:28
Reply

Marsh Posté le 16-12-2007 à 19:02:37    

il me semble que le pointeur = NULL si new echoue


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

Marsh Posté le 16-12-2007 à 19:05:02    

Le new fonctionne puisque que ça fonctionne sans les delete.
C'est les delete qui me font tout planter.

Reply

Marsh Posté le 16-12-2007 à 19:11:28    

ben alors ça vient du code entre le new et les delete...
t'y modifies pas la valeur de tes pointeurs?
T'as debuggé pour savoir quel delete plante?


Message édité par ptitchep le 16-12-2007 à 19:12:52

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

Marsh Posté le 16-12-2007 à 19:40:16    

Une fois créé, je m'en sert comme des tableaux, je modifies les données et c'est tout.

Reply

Marsh Posté le 16-12-2007 à 22:02:26    

l'erreur peut indiquer que tu modifies les données légèrement au dessus ou au dessus du tableau, genre tu modifie un t[-1] ou un t[N].

Reply

Marsh Posté le 16-12-2007 à 22:19:44    

t'as le droit d'utiliser std::vector aussi ...

Reply

Marsh Posté le 16-12-2007 à 22:31:23    

Si il utilise vector pour accéder à un élément il vaut mieux utiliser la fonction membre "at()" plutôt que l'opérateur [] ( at() vérifie les bornes alors que  l'opérateur[] est plus rapide mais ne vérifie rien).

Reply

Marsh Posté le 16-12-2007 à 22:31:23   

Reply

Marsh Posté le 16-12-2007 à 22:36:46    

Je connais pas encore assez bien la prog pour ça, j'ai commencé C++ il y a 2 mois (j'avais quand même fait pas mal de java objet avant).
 
Je me suis arrangé en trafiquant, mais je pense pas que je dépasse un tableau vu que dans certains cas j'arrive à faire varier n jusqu'a 10 millions.
 
Ce sont certains opérations de tri avec des tableaux déjà triés qui me provoquent cette erreur.

Reply

Marsh Posté le 16-12-2007 à 23:00:51    

1/ utilise std::vector didiou
2/ tu sais te servir d'un debugegr ?
3/ ton algo est certainement moisi
 
Tu fais ca pr apprendre ou pour developper ? Si c'est pour developper : std::sort :o

Reply

Marsh Posté le 16-12-2007 à 23:14:07    

Mon algo est très certainement moisi !
 
Je fais ça pour un projet pour la fac, donc pour apprendre, mais c'est plutôt les résultats des tests qui sont importants que la prog en elle même donc ça devrait passer, du moins j'espère !

Reply

Marsh Posté le 16-12-2007 à 23:18:00    

ouais enfin prendre des habitudes de chacla, ca va etre super :/
 
rencarde toi sur vector et debug ton algo :o

Reply

Marsh Posté le 16-12-2007 à 23:28:28    

J'aurai pas le temps pour celui ci malheureusement vu que je dois le rendre demain, j'ai mon rapport à terminer, mais j'ai retenu la leçons pour la prochaine fois !
 
Je regarderai vector au passage un de ces jours, merci pour les conseils en tous cas.
 
Si tu veux t'arracher les cheuveux voilà mon code :)
unlimitedriders.free.fr/test/projet2.cc

Reply

Marsh Posté le 17-12-2007 à 12:35:59    

ptitchep a écrit :

salut
Tu as vérifié que les pointeurs étaient valides apres les new?


Vérifie aussi que true est bien true, juste au cas ou.

Reply

Marsh Posté le 23-12-2007 à 23:07:45    

Taz a écrit :

Vérifie aussi que true est bien true, juste au cas ou.

[:power600]

Code :
  1. *** glibc detected *** ./projet: free(): invalid next size (fast): 0x0000000000603030 ***

Plus serieusement, le message d'erreur provient de l'allocateur dynamique de la glibc. Tu ecris bien trop loin dans un de tes tableaux et t'ecrases les meta-donnees de l'allocateur.
Alors, fait des vectors et utilise .at(size_t), t'auras bien un vieille exception pour te dire ou est-ce que tu fais de la deaube. Si t'as peur des perfs des vector (et des nb realloc qui peuvent tomber), tu commence par un bon reserve(size_t) et c'est tout bon.

Reply

Sujets relatifs:

Leave a Replay

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