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;
}

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

c 程序员 C++

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

Your Answer