[英]Using realloc to shrink the allocated memory
Simple question about the realloc function in C: If I use realloc to shrink the memory block that a pointer is pointing to, does the "extra" memory get freed? 还是需要以某种方式手动释放?
例如,如果我这样做
int *myPointer = malloc(100*sizeof(int));
myPointer = realloc(myPointer,50*sizeof(int));
free(myPointer);
我会有 memory 泄漏吗?
不,您不会有 memory 泄漏。 realloc
将简单地将 rest 标记为“可用”以供将来的malloc
操作使用。
但是您仍然需要稍后free
myPointer
。 顺便说一句,如果您在realloc
中使用0
作为大小,它在某些 implementations上将具有与free
相同的效果。 正如 Steve Jessop 和 R.. 在评论中所说,你不应该依赖它。
绝对没有 memory 泄漏,但是当您调用realloc
以减小大小时,至少会发生 3 件事:
选项 3 将是一个相当糟糕的实现,但完全合法; 仍然没有“内存泄漏”,因为如果你稍后调用它,整个东西仍然会被free
。
至于选项 1 和 2,哪个更好取决于您是偏爱性能还是避免 memory 碎片。 我相信大多数现实世界的实现都倾向于选择选项 1。
如果重新分配失败,新代码仍然会泄漏原始分配。 我希望大多数实现都不会缩小块,但这是允许的。 调用 realloc 的正确方法,无论是增大还是缩小块,都是 void *tmp = realloc(myPointer, 50*sizeof(int)); if (.tmp) { /* 以某种方式处理错误,myPointer 仍然指向旧块; 仍然分配 */ } myPointer = tmp.. – Steve Jessop 48 分钟前
嘿,我不知道如何回复你的评论,对不起。
我需要将 tmp 转换为 myPointer 的类型吗? 在这种情况下,我是否需要写
myPointer = (int*)tmp
另外,在这种情况下,当我执行 free(myPointer) 时,tmp 指向的 memory 也会被释放,对吧? 所以不需要做
free(myPointer)
free(tmp)
以您提供代码的方式,是的,它可能有泄漏。 realloc
的想法是它可以为您返回数据的新位置。 就像您在问题中这样做一样,您会丢失realloc
发送给您的指针。
int *myPointer2 = realloc(myPointer,50*sizeof(int));
assert(myPointer2);
myPointer = myPointer2;
我猜 realloc() 的过程是,它首先释放之前的 memory 块,然后再次分配(我的大学老师告诉过)。 如果情况仍然如此,它已经释放了额外的 50 个字节。 如果 100 字节 memory 中有数据,则会重新分配给 50 字节 memory,这可能会导致数据丢失。 所以不应该有 Memory 泄漏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.