我在编写 realloc 函数时遇到了困难。
我让它通过标准的 memcpy 程序工作,但我无法对其进行优化。我知道我需要适应另外两种情况:向前扩展当前块,并检查当前大小的块是否足够大(如果太大,将其拆分为释放内存)。
但是,我似乎无法正确处理。我总是出错。为了澄清,这些不是编译错误......这些是通过跟踪驱动程序失败的堆完整性检查。如果我在不拆分的情况下执行此操作,则内存不足,如果我尝试拆分,则会显示“未能保留原始块/数据”。
下面是我正常的 memcpy 代码。中间的注释部分是我尝试扩展,但我认为我需要拆分,因为它会导致大量碎片。这导致我在(一个)重新分配测试期间内存不足并出错。如果我在没有注释块的情况下这样做,它工作正常,但优化为零。
我分裂的尝试总是失败;底部的注释代码是我的尝试。我在这里做错了什么?
我将非常感谢任何帮助,谢谢。:)
#define PACK(size, alloc) ((size) | (alloc))
#define GET_SIZE(p) (GET(p) & ~0x7)
#define GET_ALLOC(p) (GET(p) & 0x1)
#define HDRP(bp) ((char *)(bp) - WSIZE)
#define FTRP(bp) ((char *)(bp) + GET_SIZE(HDRP(bp)) - DSIZE)
#define NEXT_BLKP(bp) ((char *)(bp) + GET_SIZE(((char *)(bp) - WSIZE)))
void *mm_realloc(void *oldptr, size_t size)
{
void *newptr;
size_t copySize;
copySize = GET_SIZE(HDRP(oldptr));
size_t next_alloc = GET_ALLOC(HDRP(NEXT_BLKP(oldptr)));
// if (copySize > size) return oldptr;
/*if (!next_alloc) {
if ((GET_SIZE(HDRP(oldptr)) + GET_SIZE(HDRP(NEXT_BLKP(oldptr))))>size) {
copySize += GET_SIZE(HDRP(NEXT_BLKP(oldptr)));
PUT(HDRP(oldptr), PACK(copySize,1));
PUT(FTRP(oldptr), PACK(copySize,1));
return oldptr;
}
}*/
newptr = mm_malloc(size);
if (newptr == NULL)
return NULL;
if (size < copySize)
copySize = size;
memcpy(newptr, oldptr, copySize);
PUT(newptr,GET(oldptr));
mm_free(oldptr);
return newptr;
}
// int total_avail = (GET_SIZE(HDRP(oldptr)) + GET_SIZE(HDRP(NEXT_BLKP(oldptr))));
// copySize -= (total_avail - size);