!!! Pb d'allocation mémoire !!! [Résolu]

Signaler
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
-
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
-
Bonjour à tous !

Comme le titre l'indique, j'ai un petit souci avec l'allocation de mémoire.
En fait j'ai un char*, auquel j'applique un malloc. Ensuite, la taille des données devant être contenues dans le char* n'est pas connue d'avance. J'ai donc pensé à utiliser realloc pour augmenter la taille mémoire. Seulement, de temps en temps, le realloc ne semble pas pouvoir allouer assez de mémoire. Ceci me provoqe alors une erreur.
Connaitriez-vous une fonction ou une technique pour arriver à allouer de nouveau un bloc mémoire sans être rapidement limité (< 10 Mo) ?
Merci d'avance pour votre aide.

PS : si vous souhaitez des détaills, n'hésitez pas !

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]

15 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Ah bon j'ai cru que tu faisais un taitement du contenu des fichiers.
Dans ce cas, pourquoi n'utilises-tu pas une structure de données chainée pour stocker les noms de fichiers?

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
Si tu essayais ton propre realloc:

void *myrealloc (void *mem, DWORD oldsize, DWORD newsize)
{
    char *buffer;

    if(!mem || !oldsize || !newsize) return 0;
    if(newsize == oldsize) return mem;
    if(newsize < oldsize) oldsize = newsize;

    if(!(buffer = (char*)malloc(newsize))) return 0;

    memcpy(buffer, mem, oldsize);

    free(mem);

    return (void*)buffer;
}

C++ (@++)<!--
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Merci SAKingdom pour la fonction, c'est sympa !
Il n'y a pas d'autre(s) moyen(s) afin d'éviter des memcpy ? Parce que si mem fait quelques Mo (ce qui peut arriver), ça risque d'être un peu long non ?

PS : pour l'instant, ma technique est d'utiliser un fichier (et ça fonctionne bien) mais il faudrait que j'arrive à faire le travail en interne du programme.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
Ben à moin de segmenté le buffer (par exemple, avec un tableau de pointeurs), je ne vois pas d'autre solution.

C++ (@++)<!--
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010

Bonjour,

j'aime bien le "de temps en temps". C'est a dire que tu realloues plusieurs fois de la memoire dans ton programme et, de temps en temps, ca plante ou alors tu lances plusieurs fois ton programme et, de temps en temps, ca plante ?
Tu realloues comment au maximum (environ) ?
Peut-être qu'un bout de code.

Matt...
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
En fait, c'est pour créer une arborescence de dossiers/fichiers. J'utilise donc un code récursif. La taille de l'arborescence est donc aléatoire.
Voilà une explication du code (un peu long) :
Du coup, à l'initialisation j'alloue avec malloc() pour mettre le dossier de départ de l'arborescence. Ensuite à chaque fois que je vais ajouter un fichier ou un dossier à l'arborescence, je fais un realloc(buffer, taille_arborescence + 1000);
Selon ce qui a été ajouté je fais : taille_arborescence += nombre_d'_octets_écrits;
Et ainsi de suite avec la récursivité.
J'ai essayé une autre façon, en faisant un realloc() uniquement quand c'est nécessaire :
if(_msize(Arborescence) < *TailleArb + 1000) Arborescence = (char*)realloc(Arborescence, *TailleArb + 1048576);
J'augmente la taille du bloc mémoire d'1 Mo à chaque fois que sa taille devient limite insuffisante.
Et visiblement ça à l'air de passer comme ça.
Qu'en pensez-vous ?

PS à Matt67 : le programme plante pour certaines arborescences et pas pour d'autres.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
Ton arborescence elle existe (ce sont des fichiers/dossiers qui sont sur le disque) ? Si oui, pourquoi ne pas compter tout ça avant d'allouer ? Tu aurais la somme exacte de mémoire nécessaire et pas de memcpy ou de realloc.
C++ (@++)<!--
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Oui elle existe. J'ai déjà pensé à calculer la taille avant, mais avec de grosses arborescences ça risque de mettre un peu de temps je pense (?). Donc je préfère faire le boulot (parcourir les dossiers) une seule fois si possible.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
Peut-être mais ça va prendre beacoup moin de temps que de faire des realloc.

C++ (@++)<!--
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Pour ce genre de choses je fais un seul parcours. Pendant le parcours tu remplis une liste (par exemple) contenant les fichiers et en même temps tu calcules la taille totale. Du coup plus besoin de reparcourir ton arborescence puisque tu as ta liste.

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Ah ben dans ce cas je vais essayer comme ça alors !
Je vous tiens au courant de l'évolution.
En attendant, un grand merci pour votre aide.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
SAKingdom> Ca pourrait être plus lent de refaire un parcours de l'arborescence, par exemple si le dossier à parcourir est situé sur un lecteur réseau et que le débit est lent.

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Vecchio56 tu peux m'en dire un peu plus sur le terme "liste" stp ?
Parce que moi c'est déjà ce que je fais de lister les noms des fichiers et dossiers pendant le parcours.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Ah oui les listes chainées ! Je me rappelle avoir déjà vu ça en cours d'algo. On a jamais fait en pratique. Je crois que ça va être l'occasion de s'y lancer !
J'ai du boulot qui m'attend je crois....zou je file !

Je vous tiens au courant.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Bonne nouvelle ! J'ai réussi à m'en sortir. Et tout ça grâce aux listes chainées. Comme quoi les cours ça sert desfois.
Un grand merci à vous tous pour m'avoir aidé et merci vecchio56 pour m'avoir trouvé cette petite idée qui a fait toute la différence.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]