我想写自己的内存管理器.目标语言是C++,内存管理器的目标主要是帮助调试.它应该检测双重释放,内存覆盖等.当然 - 我想了解内存管理.
有人可以给我一些提示,以便我可以学习如何编写这样的内存管理器吗?
谢谢您的帮助.
编程语言: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 …Run Code Online (Sandbox Code Playgroud) 我的工具是Linux,gcc和pthreads.当我的程序从多个线程调用new/delete时,并且当存在堆争用时,'arena'被创建(参见以下链接以供参考http://www.bozemanpass.com/info/linux/malloc/Linux_Heap_Contention.html).我的程序全天候运行,2周后偶尔会创建竞技场.我认为最终可能会出现与线程一样多的竞技场.ps(1)显示了惊人的内存消耗,但我怀疑它实际上只映射了一小部分.
空旷竞技场的"开销"是多少?(如果所有分配仅限于传统堆,则每个竞技场使用多少内存?)
有没有办法在n竞技场之前强制创作?有没有办法强迫破坏空的竞技场?
在对SO的相关问题进行快速扫描之后,我推断出没有能够检查malloc已分配给指针的内存量的函数.我正在尝试使用C中的简单char*复制一些std :: string基本功能(主要是动态大小),并且不想一直调用realloc.我想我需要跟踪已经分配了多少内存.为了做到这一点,我正在考虑创建一个typedef,它将包含字符串本身和一个当前分配的内存量的整数,如下所示:
typedef struct {
char * str;
int mem;
} my_string_t;
Run Code Online (Sandbox Code Playgroud)
这是一个最佳解决方案,或者您可以建议一些能够带来更好结果的方案吗?在此先感谢您的帮助.