Allocation mémoire

cs_thedestiny Messages postés 56 Date d'inscription samedi 3 juillet 2004 Statut Membre Dernière intervention 30 juin 2008 - 12 mai 2005 à 23:27
cs_thedestiny Messages postés 56 Date d'inscription samedi 3 juillet 2004 Statut Membre Dernière intervention 30 juin 2008 - 14 mai 2005 à 13:46
Voila je présente mon projet brievement :
C'est un programme qui est censé ouvrir un fichier d'une taille assez conséquente ( 20 mo environ )
Plusieurs allocations en mémoire sont alors éffectuées. Je commence à allouer un buffer de la taille du fichier en mémoire pour procéder au décryptage. Ensuite, je fait appel à plusieurs procédures de chargement des informations qui transfert ca dans une structure qui contient toutes les variables utilisées ( 120 - 130 au total ), cependant lors de chaque procédure, je fais une allocation en mémoire de ma structure. Lorsque toutes les procédures ont été réalisées, je free la mémoire du buffer contenant les données du fichier, j'affiche les informations que contient le fichier, je free lles données de toutes les structures et je quitte.

Le problème est que, je ne sais pas pourquoi, ni la méthode avec malloc() ni celle de new MaStruct[] ne veut m'allouer ma mémoire nécessaire, c'est à dire approximativement 40 mo au total, il se bloque à environ 11 mo en arretant le chargement mais en restant en mémoire...
Pourtant après quelques tests, il veut bien allouer 120mo sans probleme ( certes le test les allouer en une seule fois ) donc je ne vois pas le problème, sauf si cela vient du fait qu'il y a plusieurs allocations :/

Extrait du code qui foire :
World.ClanCount = LoadLong(pData);
printf("Number of Clans : %i \n",World.ClanCount);


if(World.ClanCount > 0)
{
World.Clans = new WDAClan [World.ClanCount];
for (i=0;i<World.ClanCount;i++)
{
World.Clans[i] = LoadClan(pData);
}
}

Si vous avez des solutions, je suis tout houïe ( ou quelque chose comme ca )

Amicalement,
The Destiny

4 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
13 mai 2005 à 00:14
C'est bizarre, a priori c'est plus difficile d'allouer 120Mo en
plusieurs fois qu'en une seule fois. Est-tu bien sur que c'est un
problème d'allocation et non un bug dans ton code? Et est-tu de ne pas
allouer plus que ce que tu pense. Si tu code en Win32, tu peux essayer
VirtualAlloc, s'il y a des problèmes d'allocation tu pourra peut-être
avoir plus d'informations.
0
cs_thedestiny Messages postés 56 Date d'inscription samedi 3 juillet 2004 Statut Membre Dernière intervention 30 juin 2008
13 mai 2005 à 00:18
Merci je vais tester et voir le résultat.
Je te tiens au courant :)

Amicalement,
The Destiny
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
13 mai 2005 à 00:20
est-ce que tu es sur un poste "normal" ou bien tu travail sur un rezeau administrer ou encore sur un environement limiter ?

est-ce que tu test bien tout tes malloc, et est-ce que tu es sure des tailles que tu lui fournit ? peut-etre qu'a un moment donné tu lit une mauvaise valeur et tu appel malloc en lui donnant une taille trop grande.

ce que je te conseil pour le moment, c'est de faire provisoirement une fonction my_malloc comme ceci :

void* my malloc(int size, char *identifiant)
{
void* ptr;

printf("%s : %d\n", identifiant, size);
ptr = malloc(size);
if (ptr == null)
{
printf("erreur malloc\n");
exit(0);
}
return (ptr);
}

et tu remplace tout tes malloc par des my_malloc et tu rajoute une chaine qui te permettra d'identifier ton malloc, par exemple le nom de ta fonction, ou encore le nom de ta fonction suivit d'un numero si tu as plusieur malloc dans une meme fonction.

cela te donnera deja probablement beaucoup d'indication de debug... du moins je l'espere.
0
cs_thedestiny Messages postés 56 Date d'inscription samedi 3 juillet 2004 Statut Membre Dernière intervention 30 juin 2008
14 mai 2005 à 13:46
> Vecchio : J'ai eu quelques petits problèmes avec VirtualAlloc, notamment le fait qu'il me disait qu'un page fallait 4096 octets ( ca fait léger lol :p ) En plus VirtualAlloc plantait carrément :(

> SebSeb : J'ai testé avec ta fonction
1ere Alloc ( pour le fichier ) ca correspond, 19 806 275 )
La 2eme tout va bien aussi ( 762 )
3eme idem ( 4 )
4eme idem ( 1658 )
5eme idem ( 1467 )
6eme idem ( 279 )
7eme idem ( 267 )
8eme idem ( 1114 )
et le 9eme crash ce coup la...

Je vais juste vérifier quelque chose qui me semble louche car je crois que je lis pas les valeurs qui doivent être contenues par mon pointeur.
En plus c'est un peu chiant car à chaque fois j'ai 19mo qui ne sont pas désalloué :(

Merci en tout cas :)

Amicalement,
The Destiny
0
Rejoignez-nous