简单的C实现跟踪内存malloc / free?

前端之家收集整理的这篇文章主要介绍了简单的C实现跟踪内存malloc / free?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
编程语言:C
平台: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也可以轻松地用于栅栏指针/指纹等.

猜你在找的C&C++相关文章