Simple implémentation C pour suivre la mémoire malloc / gratuit?

langage de programmation: C
plate-forme: BRAS
Compilateur: ANNONCES 1.2

J'ai besoin de garder une trace de simple melloc/free appels dans mon projet. J'ai juste besoin d'obtenir une très idée de base de la façon dont beaucoup de segment de mémoire est requis lorsque le programme a attribué toutes ses ressources. Donc, j'ai fourni un wrapper pour la malloc/free appels. Dans ces wrappers j'ai besoin d'incrémenter un mémoire en cours d'inventaire lors de l' malloc est appelé et de décrémentation quand free est appelé. Le malloc cas est très simple car j'ai la taille à allouer de l'appelant. Je me demande comment traiter avec les free cas que j'ai besoin de stocker le pointeur/taille de la cartographie quelque part. Ceci étant C, je n'ai pas de carte standard à mettre en œuvre facilement.

J'essaie d'éviter de liaison dans les bibliothèques afin préférerait *.c/h mise en œuvre.

Alors je me demande si il y a déjà une mise en œuvre simple un peut me conduire à. Si non, c'est la motivation pour aller de l'avant et de mettre en œuvre.

EDIT: Purement à des fins de débogage et ce code n'est pas fourni avec le produit.

EDIT: mise en œuvre Initiale basée sur la réponse de Makis. J'aimerais avoir des commentaires sur ce.

EDIT: Retravaillé la mise en œuvre

#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <limits.h>
static size_t gnCurrentMemory = 0;
static size_t gnPeakMemory    = 0;
void *MemAlloc (size_t nSize)
{
void *pMem = malloc(sizeof(size_t) + nSize);
if (pMem)
{
size_t *pSize = (size_t *)pMem;
memcpy(pSize, &nSize, sizeof(nSize));
gnCurrentMemory += nSize;
if (gnCurrentMemory > gnPeakMemory)
{
gnPeakMemory = gnCurrentMemory;
}
printf("PMemAlloc (%#X) - Size (%d), Current (%d), Peak (%d)\n",
pSize + 1, nSize, gnCurrentMemory, gnPeakMemory);
return(pSize + 1);
}
return NULL;
}
void  MemFree (void *pMem)
{
if(pMem)
{
size_t *pSize = (size_t *)pMem;
//Get the size
--pSize;
assert(gnCurrentMemory >= *pSize);
printf("PMemFree (%#X) - Size (%d), Current (%d), Peak (%d)\n",
pMem,  *pSize, gnCurrentMemory, gnPeakMemory);
gnCurrentMemory -= *pSize;
free(pSize);
}
}
#define BUFFERSIZE (1024*1024)
typedef struct
{
bool flag;
int buffer[BUFFERSIZE];
bool bools[BUFFERSIZE];
} sample_buffer;
typedef struct
{
unsigned int whichbuffer;
char ch;
} buffer_info;
int main(void)
{
unsigned int i;
buffer_info *bufferinfo;
sample_buffer  *mybuffer;
char *pCh;
printf("Tesint MemAlloc - MemFree\n");
mybuffer = (sample_buffer *) MemAlloc(sizeof(sample_buffer));
if (mybuffer == NULL)
{
printf("ERROR ALLOCATING mybuffer\n");
return EXIT_FAILURE;
}
bufferinfo = (buffer_info *) MemAlloc(sizeof(buffer_info));
if (bufferinfo == NULL)
{
printf("ERROR ALLOCATING bufferinfo\n");
MemFree(mybuffer);
return EXIT_FAILURE;
}
pCh = (char *)MemAlloc(sizeof(char));
printf("finished malloc\n");
//fill allocated memory with integers and read back some values
for(i = 0; i < BUFFERSIZE; ++i)
{
mybuffer->buffer[i] = i;
mybuffer->bools[i] = true;
bufferinfo->whichbuffer = (unsigned int)(i/100);
}
MemFree(bufferinfo);
MemFree(mybuffer);
if(pCh)
{
MemFree(pCh);
}
return EXIT_SUCCESS;
}

source d'informationauteur dubnde | 2009-05-12