C 微内存管理器错误
我试图在我的C程序中编写简单的内存管理器(我应该说是内存跟踪器) 我基本上是在创建分配块的双链接列表,我在每个块的开始处将指针放在上一个和下一个上。Malloc过程如下所示:C 微内存管理器错误,c,memory-management,malloc,C,Memory Management,Malloc,我试图在我的C程序中编写简单的内存管理器(我应该说是内存跟踪器) 我基本上是在创建分配块的双链接列表,我在每个块的开始处将指针放在上一个和下一个上。Malloc过程如下所示: typedef struct MemUnit TMemUnit; struct tMemUnit { TMemUnit *prev; TMemUnit *next; } TMemUnit *new = malloc(sizeof(TMemUnit)
typedef struct MemUnit TMemUnit;
struct tMemUnit
{
TMemUnit *prev;
TMemUnit *next;
}
TMemUnit *new = malloc(sizeof(TMemUnit) + wantedSize);
if (new == NULL)
/* ERROR */
else
{
if (memFirst == NULL) {
memFirst = new;
memLast = new;
new->prev = NULL;
new->next = NULL;
} else {
new->prev = memLast;
new->next = NULL;
memLast->next = new;
memLast = new;
}
return (void *)(new + sizeof(TMemUnit));
问题是在以前没有的地方分割错误
Valgrind还提供无效的读/写错误
==22872== Invalid write of size 4
==22872== at 0x400FF1: main (test-memory.c:40)
==22872== Address 0x54d51b0 is not stack'd, malloc'd or (recently) free'd
当我为这个错误打印分配块的地址(wantedSize=20*sizeof(int),尝试写入第一个int)时,它们看起来正常:
new --> 0x54d5030
new + sizeof(TMemUnit) + wantedSize --> 0x54d5430
我不知道我的错误在哪里
谢谢尝试使用return(void*)(new+1)代替return(void*)(new+sizeof(TMemUnit))
指针算术(p+n)已经以sizeof(*p)为单位计数。问题可能在于:
return (void *)(new + sizeof(TMemUnit));
您的new
指针的类型为TMemUnit*
,因此根据C指针算法的规则,您将添加sizeof(TMemUnit)*sizeof(TMemUnit)
字节,这太多了。相反,请尝试:
return (void *)((char *)new + sizeof(TMemUnit));
您可能希望
返回(void*)((char*)new+sizeof(TMemUnit))代码>备选方案:返回(无效*)和新建[1];我会考虑避免使用C++关键字<代码>新< /COD>。这里没有问题。我知道,但是C可以用C++编译器编译,编写可重用代码是很好的。