关于C中的realloc函数的简单问题: 如果我使用realloc来缩小指针所指向的内存块,那么“额外”内存是否会被释放?或者是否需要以某种方式手动释放?
例如,如果我这样做
int *myPointer = malloc(100*sizeof(int));
myPointer = realloc(myPointer,50*sizeof(int));
free(myPointer);
我是否会有内存泄漏?
答案 0 :(得分:20)
不,你不会有内存泄漏。 realloc
只会将剩余的“可用”标记为将来的malloc
操作。
但您稍后仍需要free
myPointer
。另外,如果您在0
中使用realloc
作为大小,则在某些实现上与free
具有相同的效果。正如Steve Jessop和R ..在评论中所说,你不应该依赖它。
答案 1 :(得分:15)
肯定没有内存泄漏,但当您致电realloc
缩小尺寸时,至少会发生3件事情:
选项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个重新分配的字节内存,这可能会导致数据丢失。因此,不应有内存泄漏。