首页 百科知识 先释放,再重新分配

先释放,再重新分配

时间:2022-09-22 百科知识 版权反馈
【摘要】:很多C实现为用户提供了三个内存分配函数:malloc()、realloc()和free()。调用malloc返回一个指向有n个字符的新分配的内存的指针,这个指针可以由程序员使用。这一特性保留在从UNIX第七版衍生出来的系统中:可以先释放一块存储区域,然后再重新分配它。然而,第七版的手册遗留了一个未声明的问题:realloc()的原始实现实际上是必须要先释放再重新分配的。

7.8 先释放,再重新分配

    很多C实现为用户提供了三个内存分配函数:malloc()realloc()free()。调用malloc(n)返回一个指向有n个字符的新分配的内存的指针,这个指针可以由程序员使用。给free()传递一个指向由malloc()分配的内存的指针可以使这块内存得以再次使用。通过一个指向已分配区域的指针和一个新的大小调用realloc()可以将这块内存扩大或缩小到新尺寸,这个过程中可能要复制内存。

 

    也许有人会想,真相真是有点微妙啊。下面是System V接口定义中出现的对realloc()的描述:

 

realloc改变一个由ptr指向的size个字节的块,并返回该块(可能被移动)的指针。在新旧尺寸中比较小的一个尺寸之下的内容不会被改变。

 

UNIX系统第七版的参考手册中包含了这一段的副本。此外,还包含了描述realloc()的另外一段:

 

如果在最后一次调用mallocrealloccalloc后释放了ptr所指向的块,realloc依旧可以工作;因此,freemallocrealloc的顺序可以利用malloc压缩存贮的查找策略。

 

因此,下面的代码片段在UNIX第七版中是合法的:

 

free (p);

p = realloc(p, newsize);

 

    这一特性保留在从UNIX第七版衍生出来的系统中:可以先释放一块存储区域,然后再重新分配它。这意味着,在这些系统中释放的内存中的内容在下一次内存分配之前可以保证不变。因此,在这些系统中,我们可以用下面这种奇特的思想来释放一个链表中的所有元素:

 

for(p = head; p != NULL; p = p->next)

    free((char*)p);

 

而不用担心调用free()会导致p->next不可用。

 

    不用说,这种技术是不推荐的,因为不是所有C实现都能在内存被释放后将它的内容保留足够长的时间。然而,第七版的手册遗留了一个未声明的问题:realloc()的原始实现实际上是必须要先释放再重新分配的。出于这个原因,一些C程序都是先释放内存再重新分配的,而当这些程序移植到其他实现中时就会出现问题。

 

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈