开发者社区> 问答> 正文

c中free函数的一些问题探讨

1 一次性分配较大内存,free如何获知该内存大小并完全释放,实现机制是?

2 如下代码:

int *p = (int*)malloc(sizeof(int));
free((char*)p);
什么情况下会出现内存泄漏?

3 <c prime>一书一个版本在高级数据结构一节中写过如下代码:

while(p != NULL){
    free(p);
    p = p->next;
}

这样的用法是否永远可行?

展开
收起
a123456678 2016-06-06 11:30:53 2021 0
2 条回答
写回答
取消 提交回答
  • while(p != NULL){

    free(p);
    p = p->next;

    }
    上面这一段是 链表结构,同时,这一段是错误的。因为先释放,后引用。

    我们来说这个问题“ 一次性分配较大内存,free如何获知该内存大小并完全释放,实现机制是”
    可以参考这个:
    https://blog.csdn.net/mmshixing/article/details/51679571

    看不懂?没关系,简单来说,你看到的内存,并不是真正的内存。malloc 机制会额外维护一套数据,里面保存了
    当前的数据的大小、位置等等,他都帮你做了。所以,你不必关心你申请了多少内存。

    2019-07-17 19:28:02
    赞同 展开评论 打赏
  • (glibc 的)malloc 等函数在分配时会记录每块内存的起始位置和大小
    看你加 C++ 标签了,但问的问题似乎仅仅是 C。在 C 语言中,一般是不转换 malloc 的返回值的类型的。通常情况下不会有问题。当 char 的大小比 int 小时由于整型截断,会出问题的(不是内存泄漏那么简单)。但是好像找不到这两种指针大小不一样的系统了吧?
    永远不可行,因为它在逻辑上是错误的。一、另一线程可以在你访问之前使用了该内存块;二、内存分配器可以为了安全起见将已释放的内存清零;三、其它情况。

    2019-07-17 19:28:02
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
WHY"FREE" AND"TRIAL" ARE THE N 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载