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

  FORUM HardWare.fr
  Programmation
  C++

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

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1659008
Fused
Posté le 16-12-2007 à 17:38:24  profilanswer
 

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 !

mood
Publicité
Posté le 16-12-2007 à 17:38:24  profilanswer
 

n°1659023
ptitchep
Posté le 16-12-2007 à 18:57:48  profilanswer
 

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


---------------
deluser --remove-home ptitchep
n°1659024
Fused
Posté le 16-12-2007 à 18:59:23  profilanswer
 

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
n°1659025
ptitchep
Posté le 16-12-2007 à 19:02:37  profilanswer
 

il me semble que le pointeur = NULL si new echoue


---------------
deluser --remove-home ptitchep
n°1659026
Fused
Posté le 16-12-2007 à 19:05:02  profilanswer
 

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

n°1659028
ptitchep
Posté le 16-12-2007 à 19:11:28  profilanswer
 

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
n°1659037
Fused
Posté le 16-12-2007 à 19:40:16  profilanswer
 

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

n°1659085
sligor
Calme, mais pas trop
Posté le 16-12-2007 à 22:02:26  profilanswer
 

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].

n°1659093
Joel F
Real men use unique_ptr
Posté le 16-12-2007 à 22:19:44  profilanswer
 

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

n°1659095
sligor
Calme, mais pas trop
Posté le 16-12-2007 à 22:31:23  profilanswer
 

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).

mood
Publicité
Posté le 16-12-2007 à 22:31:23  profilanswer
 

n°1659096
Fused
Posté le 16-12-2007 à 22:36:46  profilanswer
 

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.

n°1659099
Joel F
Real men use unique_ptr
Posté le 16-12-2007 à 23:00:51  profilanswer
 

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

n°1659102
Fused
Posté le 16-12-2007 à 23:14:07  profilanswer
 

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 !

n°1659104
Joel F
Real men use unique_ptr
Posté le 16-12-2007 à 23:18:00  profilanswer
 

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

n°1659106
Fused
Posté le 16-12-2007 à 23:28:28  profilanswer
 

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

n°1659315
Taz
bisounours-codeur
Posté le 17-12-2007 à 12:35:59  profilanswer
 

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.

n°1662707
jojoleping​ouin
Posté le 23-12-2007 à 23:07:45  profilanswer
 

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.


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

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

 

Sujets relatifs
[C#] Problème d'emulation sur Visual Studio (Windows CE 5.0)Problème avec un select
[c++][resolu]Problème de compilation.($résolu = 'ok') probleme avec FALSE et TRUE
Probleme sur la suite de conway en java !Problème de cache navigateur - iFrame
[Delphi] Problème dans un code / N'affiche jamais la variableProblème de jointure
Page dynamique ne s'affiche pas php/mysql/easyphp 
Plus de sujets relatifs à : [C++] Problème d'allocation dynamique


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