язык программирования: C
платформа: ARM
Компилятор: ADS 1.2
Мне нужно отслеживать простые melloc/free
звонки в моем проекте. Мне просто нужно получить очень общее представление о том, сколько кучи памяти требуется, когда программа распределяет все свои ресурсы. Поэтому я предоставил оболочку для вызовов malloc/free
. В этих оболочках мне нужно увеличить текущий счетчик памяти при вызове malloc
и уменьшить его при вызове free
. Случай malloc
прост, так как у меня есть размер, выделяемый вызывающей стороной. Мне интересно, как поступить со случаем free
, так как мне нужно где-то хранить отображение указателя / размера. Это C, у меня нет стандартной карты, чтобы легко это реализовать.
Я стараюсь избегать ссылок в любых библиотеках, поэтому предпочел бы реализацию * .c / h.
Так что мне интересно, есть ли уже простая реализация, к которой я могу привести. Если нет, то это мотивация пойти дальше и реализовать его.
РЕДАКТИРОВАТЬ: чисто для отладки, и этот код не поставляется с продуктом.
РЕДАКТИРОВАТЬ: Первоначальная реализация на основе ответа от Makis. Буду признателен за отзыв об этом.
РЕДАКТИРОВАТЬ: переработанная реализация
#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;
}