free()函数到底做了什么?#includestdio.h#includestdlib.h#includestring.hvoid GetMemory(char **p
free()函数到底做了什么?
#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.
[解决办法]不一定不变,free,malloc后可以使两个空闲空间合并,里面有标识的分配情况记录
[解决办法]内核通过一个红黑树来记录了空闲的内存,malloc就是从树中查找一块大小适合的内存并把地址给你,然后把这个节点从树中摘除,避免被别人分配到产生冲突。这个内存现在归你一个人用了。
free函数是把你的这个内存重新放回到红黑树中,让别人可以申请到这个内存。从逻辑上来说,你现在不能在使用这个内存了,因为它已经不属于你。但是系统的实现上目前没有做到,所以你还是能访问这个地址。
另外,系统也不会帮你覆盖内存中的数据,因为做这一个操作浪费时间,没有必要。
打一个简单的比方。你租了一套房子,后来租期到了,房子回到房东手里,或者又转租给别人。但是你拿着原来的钥匙还是能进入那套房子,虽然这个是不合法的。
[解决办法]而且你进入这套房子后,里面不一定就一定有变化。(^_^)
[解决办法]free只是向操作系统交出申请的那块内存的控制权,但是内存里的内容还未来得及改变,也许下一刻就改变了,假如有新的申请内存请求的话,可能操作系统就会把这块内存重新分配出去,也可能把别的内存分配出去
[解决办法]用free()函数之后,指针所指向的内存区域被释放,这块内存可以被其他程序使用,
在没有被其他程序使用前所存储的数据没有被改变,结果不确定。
[解决办法]free释放了malloc申请的内存,不改变指针的值
[解决办法]free(str)释放了str指示的内存空间,str这个指针变量本身仍然存在。这就是悬垂指针问题
[解决办法]应该确切讲是不变的。内存管理多数是通过一个MBC链表实现的,及你实际分配的内存空间为:(nSize + 3) / 4 * 4 + sizeof(MBC)的大小,在malloc之后,系统程序实际返回的是分配的MBC地址+sizeof(MBC),释放内存时,free所做的第一个动作是ptr - sizeof(MBC)得到实际的MBC块,在这个MBC块中包含了该内存的大小,内存MBC链的指针等信息;所以,如果你使用了超出实际分配内存大小的空间,会造成整个MBC链的混乱,最直接表现是程序在free时在另一个不相关的地方出现了异常;所以您可以看出来,在执行了free之后,该块内存并没有改变,即使该块内存相邻内存为空,而发生了内存块的合并,您刚才使用的内存空间也没有发生改变(你看到的),改变的是MBC链表;
详细的内存管理程序您可以参考一些库,如dlmalloc,这个库除了使用了MBC链外,还是用了沙箱机制;事实上早期DOS的内存管理程序也是使用的MBC链;
[解决办法]不改变指针的值,也不改变指针指向的内存空间里的数据,他改变的,只是该内存空间的属性。
调用malloc函数分配内存的时候,得到的内存是属于你这个程序的。
调用free函数后,这块内存空间就不属于你的程序的了,其它程序都可以调用malloc函数分配内存,有可能得到该块内存,进而修改里面的数据。
[解决办法]就是赵老师说的:
申请的时候就已经记录下来了,不然的话,它也不知道这块内存到底要释放多少。
记得有个地方说free函数不仅仅是释放内存,还会整理内存碎片,合并临近内存空间(大致意思是这样的)。。。