使用realloc缩小分配的内存

时间:2011-08-16 12:11:40

标签: c memory-management realloc

关于C中的realloc函数的简单问题: 如果我使用realloc来缩小指针所指向的内存块,那么“额外”内存是否会被释放?或者是否需要以某种方式手动释放?

例如,如果我这样做

int *myPointer = malloc(100*sizeof(int));
myPointer = realloc(myPointer,50*sizeof(int));
free(myPointer);

我是否会有内存泄漏?

5 个答案:

答案 0 :(得分:20)

不,你不会有内存泄漏。 realloc只会将剩余的“可用”标记为将来的malloc操作。

但您稍后仍需要free myPointer。另外,如果您在0中使用realloc作为大小,则在某些实现上与free 具有相同的效果。正如Steve Jessop和R ..在评论中所说,你不应该依赖它。

答案 1 :(得分:15)

肯定没有内存泄漏,但当您致电realloc缩小尺寸时,至少会发生3件事情:

  1. 实现以新请求的长度拆分已分配的内存块,并在结束时释放未使用的部分。
  2. 实现使用新大小进行新分配,将旧内容复制到新位置,并释放整个旧分配。
  3. 实施什么都不做。
  4. 选项3将是一个相当糟糕的实施,但完全合法;仍然没有“内存泄漏”,因为如果您稍后在其上调用free,整个内容仍将被释放。

    对于选项1和2,哪个更好取决于您是喜欢性能还是避免内存碎片。我相信大多数现实世界的实施都倾向于做选项1。

答案 2 :(得分:4)

如果realloc失败,新代码仍会泄漏原始分配。我希望大多数实现都不会缩小块,但它是允许的。无论是增长还是缩小块,调用realloc的正确方法都是void * tmp = realloc(myPointer,50 * sizeof(int)); if(!tmp){/ *以某种方式处理错误。 myPointer仍然指向旧块,仍然分配* /} myPointer = tmp;。 - Steve Jessop 48分钟前

嘿,我无法弄清楚如何回复你的评论,对不起。

我是否需要将tmp转换为myPointer的类型?在这种情况下,我需要写

myPointer = (int*)tmp

此外,在这种情况下,当我这样做     免费(myPointer) tmp指向的内存也将被释放,对吧?所以不需要做

free(myPointer)
free(tmp)

答案 3 :(得分:3)

在您提供代码的方式中,是的,它可能有泄漏。 realloc的想法是它可以为您返回数据的新位置。就像你在问题中所做的那样,你会失去realloc发送给你的指针。

int *myPointer2 = realloc(myPointer,50*sizeof(int));
assert(myPointer2); 
myPointer = myPointer2;

答案 4 :(得分:0)

我猜想realloc()的过程是,它首先释放先前的内存块,然后再次分配(我的大学老师告诉我)。如果仍然如此,它将已经释放了额外的50个字节。如果100字节内存中有数据,则会分配给50个重新分配的字节内存,这可能会导致数据丢失。因此,不应有内存泄漏。