Mos*_*ein 26 c memory-management realloc
关于C中的realloc函数的简单问题:如果我使用realloc来缩小指针所指向的内存块,那么"额外"内存是否会被释放?还是需要以某种方式手动释放?
例如,如果我这样做
int *myPointer = malloc(100*sizeof(int));
myPointer = realloc(myPointer,50*sizeof(int));
free(myPointer);
Run Code Online (Sandbox Code Playgroud)
我会有内存泄漏吗?
cni*_*tar 20
不,你不会有内存泄漏.realloc将简单地标记其余的"可用"以用于将来的malloc操作.
但你以后还是要free myPointer等.顺便说一句,如果你使用0大小realloc,它将具有与free 某些实现相同的效果.正如Steve Jessop和R ..在评论中所说,你不应该依赖它.
R..*_*R.. 15
肯定没有内存泄漏,但是当你调用realloc缩小大小时,至少有3件事情会发生:
选项3将是一个相当糟糕的实施,但完全合法; 仍然没有"内存泄漏",因为如果你以后再打电话free,整个事情仍将被释放.
对于选项1和2,哪个更好取决于您是喜欢性能还是避免内存碎片.我相信大多数现实世界的实施都倾向于选择1.
如果重新分配失败,新代码仍然会泄漏原始分配。我希望大多数实现都不会无法缩小块,但这是允许的。调用 realloc 的正确方法,无论是增大还是缩小块,都是 void *tmp = realloc(myPointer, 50*sizeof(int)); if (!tmp) { /* 以某种方式处理错误。myPointer 仍然指向旧块,它仍然被分配 */ } myPointer = tmp;。– 史蒂夫·杰索普 48 分钟前
嘿,我不知道如何回复你的评论,抱歉。
我是否需要将 tmp 转换为 myPointer 的类型?在这种情况下,我是否需要写
myPointer = (int*)tmp
Run Code Online (Sandbox Code Playgroud)
另外,在这种情况下,当我执行 free(myPointer) 时,tmp 指向的内存也会被释放,对吗?所以没必要做
free(myPointer)
free(tmp)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23813 次 |
| 最近记录: |