begin process at 2012 05 29 08:01:59
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Linux

 > 

Autre

 > 

malloc,calloc,realloc,free


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

malloc,calloc,realloc,free

jeudi 24 mai 2007 à 20:46:58 | malloc,calloc,realloc,free

halima

Bonjour je dois ecrire les fonction malloc calloc realloc et free pour qu'ils agissent exactement comme ceux de la bibliothe (stdlib).le maximun de memoire a allouer est 1MB et je dois gerer toutes les erreurs d'allocation.jai ecris une partie mais jai des pb avec la fonction malloc.Si quelqu'un l'a deja fais j'aimerai bien voir les codes pour comparer et me debloquer.Sinon j'aimerai bien de l'aide.
 

Code :
				
  1. #include "halde.h"
  2. #include <unistd.h>
  3. #include <errno.h>
  4. #include <string.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7.  
  8. #define KENNUNG ((void*)0x00beef00)
  9. #define SIZEMBLOCK (sizeof(mblock))
  10. #define MB (1024*1024)
  11.  
  12. /* Speicherverwaltung */
  13. typedef struct mblock {
  14.     size_t size;
  15.     struct mblock *next;
  16. } mblock;
  17.  
  18. /* globale Variablen */
  19. static char *newmem = NULL;
  20. static mblock *fsp = NULL;
  21.  
  22. int bloecke = 0;
  23.  
  24. static mblock *getMblock(void *ptr){
  25.     if(NULL == ptr)
  26.         returnNULL;
  27.     return(mblock *)((char *)ptr - SIZEMBLOCK);
  28. }
  29.  
  30. static void init(){
  31.     newmem = (char *)sbrk(MB);
  32.     if(-1 == (int)newmem){
  33.         perror("sbrk");
  34.         exit(EXIT_FAILURE);
  35.     }else{
  36.         fsp = (mblock *)newmem;
  37.         fsp->size = MB-SIZEMBLOCK;
  38.         fsp->next = NULL;
  39.     }
  40. }
  41.  
  42. void *malloc(size_t size){
  43.     mblock *fsp_alt = fsp;
  44.     mblock *fsp_neu = fsp;
  45.     mblock *fsp_merken = fsp;
  46.     int units = 0;
  47.     int lauf = 0;
  48.     
  49.     if(NULL == newmem){
  50.         init();
  51.     }
  52.  
  53.     if(size == 0)
  54.         return(void *)1;
  55.     
  56.     while(fsp_alt && fsp_alt->size < size){
  57.         /* Speicher finden */
  58.         fsp_merken = fsp_alt;
  59.         fsp_alt = fsp_alt->next;
  60.         lauf++;
  61.     }
  62.     
  63.     if(!fsp_alt){
  64.         errno = ENOMEM;
  65.         returnNULL;
  66.     }
  67.  
  68.     units = ((size-1) / SIZEMBLOCK) + 1;
  69.     if(fsp_alt->size > (((units + 1) * SIZEMBLOCK) + SIZEMBLOCK)){
  70.         fsp_neu = fsp_alt + 1 + units;
  71.         fsp_neu->size = fsp_alt->size - (units + 1) * SIZEMBLOCK;
  72.         fsp_neu->next = fsp_alt->next;
  73.     }else{
  74.         fsp_neu = fsp_alt->next;
  75.     }
  76.     fsp_alt->next = KENNUNG;
  77.     bloecke++;
  78.     
  79.     if(fsp_alt == fsp)
  80.         fsp = fsp_neu;
  81.     else{
  82.         fsp_merken->next = fsp_neu;
  83.     }
  84.  
  85.     return((void *)(fsp_alt + 1));
  86. }
  87.  
  88. void free ( void* ptr){
  89.     mblock *tmp = NULL;
  90.     if(NULL == ptr || ptr == (void *)1)
  91.         return;
  92.     tmp = getMblock(ptr);
  93.     if(tmp->next != KENNUNG){
  94.         abort();
  95.     }else{
  96.         tmp->next = fsp;
  97.         fsp = tmp;
  98.     }
  99. }
  100.  
  101. void *realloc(void *ptr,size_t size){
  102.     mblock *tmp = getMblock(ptr);
  103.     if(ptr == (void *)1 || ptr == NULL){
  104.         returnmalloc(size);
  105.     }
  106.     if(size == 0){
  107.         free(ptr);
  108.         returnNULL;
  109.     }
  110.     if(size == tmp->size){
  111.         return ptr;
  112.     }else{
  113.         void *new = NULL;
  114.         free(ptr);
  115.         new = malloc(size);
  116.         if(new != ptr)
  117.             new = memcpy(new,ptr,tmp->size);
  118.         returnnew;
  119.     }
  120.     
  121.     
  122.   returnNULL;
  123. }
  124.  
  125. void *calloc(size_t nmemb, size_t size){
  126.     void *new = malloc(nmemb*size);
  127.     if(new)
  128.         memset(new,0,nmemb*size);
  129.   returnnew;
  130. }
jeudi 24 mai 2007 à 21:13:45 | Re : malloc,calloc,realloc,free

acx01b

salut perso j'ai rien compris à ton code comment alloues-tu la mémoire ?? ce qui me vient à l'idée ça serait de commencer par un tableau global char mem[1024*1024]; ensuite tu alloues des blocs à l'intérieur de cette memoire en faisant comme les compilateurs C: la première case du tableau indique la taille de la mémoire qui suit
jeudi 24 mai 2007 à 21:25:21 | Re : malloc,calloc,realloc,free

BruNews

Administrateur CodeS-SourceS
"je dois ecrire les fonction malloc..."
Faudra donc appeler les fonctions d'allocation du système hote.
Compilant pour Windows, malloc() finit chez HeapAlloc(), sous Linux aucune idée.

ciao...
BruNews, MVP VC++
jeudi 24 mai 2007 à 21:34:32 | Re : malloc,calloc,realloc,free

halima

c'est vraiment difficile de comprendre avec cet affichage pourtant jai utilisé la balise de code.en fait je cree un espace en utilisant la fonction sbrk(). En fait quant je verifie abec le dbg je me retrouve avec une bouble infinie au niveau de malloc ou free je sais pas trop.je n'arrive pas a reperer l'erreur-


Cette discussion est classée dans : alt, void, ptr, size, fsp


Répondre à ce message

Sujets en rapport avec ce message

Memory Pool [ par guiguikun ] Bonjour,j'ai téléchargé la partie du code source de Quake3 releasé par ID Software par curiosité.Je l'ai lu pour voir un peu comment le jeu fonctionna [debutant]Operation de chaine encore :s [ par firemax ] Bonjour Certain reconaitrons ce code (surtout vecchio56) mais voila ca marche toujours pas et je ne comprend pas :'( Please helllppp Code : #in Surcharge d'opérateur [ par lucyhle ] Bonjour, J'ai des trous de mémoires de de compétences sur la surcharge d'opérateur. A quoi ca sert? Par exemple ici: pourquoi surcharge t'on les opé aide [ par achrafgassolina ] salut tout le monde la j ai une érreure et je c pas comment la resoudre dans la ligne 296:36 dans la condition if et aprés je veux faire la saisie des map [ par taieb84 ] salut j'ai une classe caisse class caisse{            float val;        int nbr;            public:            bool exist(float);    void ajouter(floa Pb avec D3DXCreateTextureFromFileInMemory [ par DIMUSERS ] Bonjour,Je vous soumet un code qui ne fonctionne pas ! Le but recherché est de créer une texture avec un texte issu d'une fonte du GDI. Le code retour STL: pb mémoire "physique" non libérée avec un vector [ par pipocodesrc ] Bonjour à tous, j'utilise des vecteurs pour stocker des objets 3d, ors la mémoire physique utilisée par le vecteur au fur et à mesure de ses besoins n Modification Size d'un Label [ par lillith212 ] Bonjour à tous,Je suis entrain de réaliser mes premiers pas en C++ et je suis entrain de réaliser une application en C++ builder 6Je travaille sous wi Ajouter, Modifier ou Supprimer(lire et écrire) dans un fichier texte [ par cathy9999 ] Bonjour, je souhaite réaliser une gestion de clients en c++, c'est à dire me permettre d'afficher, ajouter, modifier ou supprimer un client qui serait du C au C++ [ par nidhaletec ] si quelqu un m aide à convertir cette fonktion en C++ ; c écrit en C ;void remplacer (char *filename, char *str,  char *occ){    FILE *f = fopen(filen


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,796 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales