我决定做的是

  • 调用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 如果可能的话,它会尝试将内存块与其​​后面的空闲内存块合并。仅当没有可用内存时,它才会分配新内存,复制所有内容并释放旧块。

你为什么要编写自己的分配例程?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top