使用realloc缩小分配的内存

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

例如,如果我这样做

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

我会有内存泄漏吗?

不,你不会有内存泄漏。 realloc将简单地标记其余的“可用”以用于未来的malloc操作。

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

肯定没有内存泄漏,但是当你调用realloc来减小大小时,至少会发生3件事:

  1. 该实现以新请求的长度拆分分配的存储块,并在结束时释放未使用的部分。
  2. 实现使用新大小进行新分配,将旧内容复制到新位置,并释放整个旧分配。
  3. 实现什么都不做。

选项3将是一个相当糟糕的实施,但完全合法; 仍然没有“内存泄漏”,因为如果你以后再free使用它,整个事情仍将被释放。

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

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

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

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

 myPointer = (int*)tmp 

另外,在这种情况下,当我执行free(myPointer)时,tmp指向的内存也将被释放,对吧? 所以没必要

 free(myPointer) free(tmp) 

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

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