[C/C++] free()函数和iOS release--(重点free函数)整理汇总


iOS-chat中遇到函数free,特此专门对FREE函数进行下详细介绍:

<span style="font-size:14px;">void FreeAddresses()  
{  
    int i;  
    for (i=0; i<MAXADDRS; ++i)  
    {  
        if (if_names[i] != 0) free(if_names[i]);  
        if (ip_names[i] != 0) free(ip_names[i]);  
        if (hw_addrs[i] != 0) free(hw_addrs[i]);  
        ip_addrs[i] = 0;  
    }  
    InitAddresses();  
}  </span><span style="font-size:12px;">
</span>


一、malloc()free()的基本概念以及基本用法:

原文链接:malloc()free()的基本概念

1、函数原型及说明:

void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。

关于分配失败的原因,应该有多种,比如说空间不足就是一种。

void free(void *FirstByte) 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。

2、函数的用法:

     其实这两个函数用起来倒不是很难,也就是malloc()之后觉得用够了就甩了它把它给free()了,举个简单例子:

 // Code...
        char *Ptr = NULL;
        Ptr = (char *)malloc(100 * sizeof(char));
        if (NULL == Ptr)
{
exit (1);
}
        gets(Ptr);
        // code...
        free(Ptr);
        Ptr = NULL;
        // code...

    就是这样!当然,具体情况要具体分析以及具体解决。比如说,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了。

3、关于函数使用需要注意的一些地方:

A、申请了内存空间后,必须检查是否分配成功。

B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。

C、这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会

出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。

D、虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一

些编译器的检查。




二. FREE函数的原理

原文链接:free函数的原理

网上看到了这样一个问题,“如果malloc 了一块字符串的内存,然后,它改变了这个字符串的大小,问会不会有一部分内存没有被释放掉。”这个问题,以前的确没有仔细想过。
  当然,我觉得是肯定会释放掉的,但是一直没有了解过free 的原理,不敢乱说。我看了一下操作系统的内存管理,基本上是这样的,当然各个系统的实现不一样。
  操作系统管理内存,维护了一个空闲内存链表,malloc从个链表中选出一个来使用,每个内存块都有一个头部来表示这个内存的基本信息,如内存大小,所以free 时候 能够记住原来指针所指的内存大小,而不是用内存块中是否有 \0 来临时计算指向内存的大小,不要字符串的计算长度的方法所误导。考试大论坛
  还有一点要注意的就是,系统在free 内存的时候,记住的只是 malloc 时候的地址,和 分配内存的大小。
  比如 char *p = (char *)malloc(10); 就会产生分配10个 字节。如果 你把指针的地址改变了 p = p + 1; 然后 free 就要出问题了。程序会崩溃。
  如果一定要改变指针的值,建议这样做 char *newp = p; 然后 改变 newp = newp + 1 , 最后 free(p);
  还有一点要注意,一个长度 为10 的字符串 要占用 11个字节。因为还有一个 '\0', 所以分配内存的时候要分配 lenght + 1 的大小。


三. 想要清除应用里面的配置内存,应该使用-release,但是不知道release和free()有什么区别呢?

原文链接:release和free()

free()是C标准库里面的,是一个函数。它调用malloc(),可以立即释放内存。因此它必须有malloc()传递一个指针,不然会引起异常。
-release是NSobject类的一个方法。它不会立即释放内存,它只是减少对象的一个引用计数。一直到它检测到0,然后调用-dealloc()。


四. free函数使用后结果:

原文链接:free函数

[Q]:以下代码

<span style="font-size:14px;">int *p;
p=(int *)malloc(sizeof(int));
*p=2;
free(p);</span>

free后,p还存在吗,它原先所指的内容(也就是2)是否立即消失(比如清零什么的),还是直到下一次?

[A1]:调用free,只是把p代表的地址的内存控制权交给OS,
所以你free后,p的值不会变,但是p所指向的内容可能
会变,也可能不会变,如果OS又要分配内存,就有可能把
p所代表的内存分给别的代码,这时候就有可能改变*p的值。
一般最好的写法是在释放内存后,将p设为0;
也就是:
free(p);
p = NULL; //也就是 p = 0;

[A2]:一般来说,free后,内容是不变的,而且,肯定没人主动去清0,没必要.
但是不一定到下一次覆盖才改变,你调用malloc(写堆信息),free(合并空闲块)也有可能改动到这个部分。
不过,正常情况下,这部分内容是不是还存在已经没什么意义了,因为你不应该继续使用它了。如楼上各位所说,p成了野指针.



展开阅读全文

没有更多推荐了,返回首页