编程语言:C
平台:ARM
编译器:ADS 1.2
平台:ARM
编译器:ADS 1.2
我需要跟踪我的项目中简单的melloc /免费电话.我只需要了解当程序分配了所有资源时需要多少堆内存的基本思想.因此,我为malloc / free调用提供了一个包装器.在这些包装器中,当需要调用malloc时,我需要增加一个当前的内存计数,并在调用free时递减它. malloc的情况是直接的,因为我有从调用者分配的大小.我想知道如何处理自由案例,因为我需要在某处存储指针/大小映射.这是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),pMem,*pSize,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; }
解决方法
您可以在包装器中分配一些额外的字节,并放置一个id(如果您想要能够耦合malloc()和free())或只是其中的大小.只要malloc()更多的内存,将信息存储在内存块的开头,并移动指针,返回许多字节.
这可以,btw也可以轻松地用于栅栏指针/指纹等.