free()函数到底做了什么?
- C/C++ code
#include<stdio.h>#include<stdlib.h>#include<string.h>void GetMemory(char **p,int num){ *p = malloc(num);}int main(){ char *str=NULL; str=(char *)malloc(100); if(str!=NULL) { printf("%p\n", str); } free(str); if(str!=NULL) { printf("%p\n", str); } return 0;}我的意思是,free(str)之后,str的值仍然不变,是不是说free()函数释放了str之前指向的内存块,但并不改变str自身的值?
在malloc()之后,被分配的那块内存被记了下来,不再作其它用途;free()之后,系统认为那块内存空闲,可以自由处理?
然后无论malloc()抑或free()都不改变str自身的值,str值有效与否需要程序员自己负责?
我的问题就是这样,各位大神还有什么知道的也欢迎告诉我!
谢谢!
[解决办法]
我的意思是,free(str)之后,str的值仍然不变,是不是说free()函数释放了str之前指向的内存块,但并不改变str自身的值?
对的
[解决办法]
1、free只是释放了malloc所申请的内存,并不改变指针的值;
2、由于指针所指向的内存已经被释放,所以其它代码有机会改写其中的内容,相当于该指针从此指向了自己无法控制的地方,也称为野指针;
3、为了避免失误,最好在free之后,将指针指向NULL。
[解决办法]
建议用完把指针指向NULL.
[解决办法]
[解决办法]
内核通过一个红黑树来记录了空闲的内存,malloc就是从树中查找一块大小适合的内存并把地址给你,然后把这个节点从树中摘除,避免被别人分配到产生冲突。这个内存现在归你一个人用了。
free函数是把你的这个内存重新放回到红黑树中,让别人可以申请到这个内存。从逻辑上来说,你现在不能在使用这个内存了,因为它已经不属于你。但是系统的实现上目前没有做到,所以你还是能访问这个地址。
另外,系统也不会帮你覆盖内存中的数据,因为做这一个操作浪费时间,没有必要。
打一个简单的比方。你租了一套房子,后来租期到了,房子回到房东手里,或者又转租给别人。但是你拿着原来的钥匙还是能进入那套房子,虽然这个是不合法的。
[解决办法]
[解决办法]
free只是向操作系统交出申请的那块内存的控制权,但是内存里的内容还未来得及改变,也许下一刻就改变了,假如有新的申请内存请求的话,可能操作系统就会把这块内存重新分配出去,也可能把别的内存分配出去
[解决办法]
用free()函数之后,指针所指向的内存区域被释放,这块内存可以被其他程序使用,
在没有被其他程序使用前所存储的数据没有被改变,结果不确定。
[解决办法]
free释放了malloc申请的内存,不改变指针的值
[解决办法]
free(str)释放了str指示的内存空间,str这个指针变量本身仍然存在。这就是悬垂指针问题
[解决办法]
[解决办法]
[解决办法]