使用realloc缩小分配的内存
关于C中的realloc函数的简单问题:如果我使用realloc来缩小指针所指向的内存块,那么“额外”内存是否会被释放? 或者是否需要以某种方式手动释放?
例如,如果我这样做
int *myPointer = malloc(100*sizeof(int)); myPointer = realloc(myPointer,50*sizeof(int)); free(myPointer);
我会有内存泄漏吗?
不,你不会有内存泄漏。 realloc
将简单地标记其余的“可用”以用于未来的malloc
操作。
但是你仍然需要在以后free
myPointer
。 realloc
,如果你在realloc
使用0
作为大小,它将在某些实现上具有与free
相同的效果。 正如Steve Jessop和R ..在评论中所说,你不应该依赖它。
肯定没有内存泄漏,但是当你调用realloc
来减小大小时,至少会发生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;