プログラミング言語: 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;
}