题
我决定做的是
- 调用malloc
- 将旧块复制到新块
- 释放旧块
- 并将指针返回到新块
下面的代码是我到目前为止所拥有的...但我知道这是不对的...任何有关修复代码的帮助将不胜感激...
如果您需要的代码比我提供的更多,我在这篇文章之前有一篇文章显示了所有代码。我是新人,所以只有这篇文章和我完成的最后一篇文章。谢谢。
void *mm_realloc(void *ptr, size_t size)
{
int i, p = *ptr;
// make a call to malloc to find space
//allocate memory
ptr = malloc(size_t*sizeof(int));
//copying old block to new block
if(ptr!=NULL)
for(i=0 ; i<size_t ; i++)
{
*(ptr+i) = i;
}
//freeing old block
free(ptr);
//return pointer to new block
return *ptr;
}
解决方案
理想情况下,一个 realloc()
只需查看当前块之外是否有足够的可用内存,如果有,则只需调整 arena 数据结构以就地扩展当前块。这消除了昂贵的复制操作并减少了分配失败的机会。那是为了增加尺寸。为了减少,您应该能够始终就地执行此操作,将当前块的剩余部分发送回空闲池。
通过执行 malloc/free,如果您在 arena 中有 100K,并且分配了单个 60K 块,则调用您的 mm_realloc
调整大小到50K会失败。
然而,它是一个 可行的 解决方案,至少对于第一次尝试来说是这样,所以这是我的实现方式:
void *mm_realloc (void *ptr, size_t size) {
int minsize;
void *newptr;
// Allocate new block, returning NULL if not possible.
newptr = malloc (size);
if (newptr == NULL) return NULL;
// Don't copy/free original block if it was NULL.
if (ptr != NULL) {
// Get size to copy - mm_getsize must give you the size of the current block.
// But, if new size is smaller, only copy that much. Many implementations
// actually reserve the 16 bytes in front of the memory to store this info, e.g.,
// +--------+--------------------------------+
// | Header | Your data |
// +--------+--------------------------------+
// ^
// +--- this is your pointer.
// <- This is the memory actually allocated ->
minsize = mm_getsize (ptr);
if (size < minsize)
minsize = size;
// Copy the memory, free the old block and return the new block.
memcpy (newptr, ptr, minsize);
free (ptr)
}
return newptr;
}
您会注意到您缺少的一件事是它必须只复制足够的字节 最小的 旧的和新的块。否则,您可能会因溢出其中之一而面临核心转储的风险。
此外,您的循环实际上并没有复制数据,而是将块的每个字节设置为其偏移量,并且在分配新指针时丢失了旧指针,因此我使用 newptr
让它们分开。
其他提示
您需要知道旧块有多大以及新块大小。您必须将两个大小中较小的一个复制到新块上。
您还必须确保如果 malloc() 失败,您不会销毁(释放)旧块 - 您只需返回 0。
您也不需要在 malloc() 中将大小乘以“sizeof(int)”;你确实过度分配了 4 倍或更多(理论上,可能只有 2 倍,但现在很少有人使用 16 位编译器)。
要点是 realloc
如果可能的话,它会尝试将内存块与其后面的空闲内存块合并。仅当没有可用内存时,它才会分配新内存,复制所有内容并释放旧块。
你为什么要编写自己的分配例程?