当前位置: 技术问答>linux和unix
偶发现了free函数的一个怪现象
来源: 互联网 发布时间:2016-10-18
本文导语: 我定义了一个自动增长buffer,然后从另外一个缓存中循环拷贝一串字符到到我定义的buffer中, 大致这样的: char *buffer; int buffer_length = 0; while(....) { buffer = (char *)realloc(buffer, buffer_length+101); //每...
我定义了一个自动增长buffer,然后从另外一个缓存中循环拷贝一串字符到到我定义的buffer中, 大致这样的:
我已经将buffer给free掉了, 但是为什么执行printf("%s", buffer)还可以打印其中的内容啊, 执行printf("%d", strlen(buffer))结果打印100, 好像没有理由啊? 哪位高手能帮忙分析一下原因吗?
char *buffer;
int buffer_length = 0;
while(....)
{
buffer = (char *)realloc(buffer, buffer_length+101); //每次动态追加101个空间
memcpy(buffer+buffer_length, des, 100); //从目标串des中拷贝100个字符到buffer中
buffer_length = buffer_length + 101;
*(buffer+buffer_length-1) = 0; //最后一个空间赋值为空
}
free(buffer);
printf("%s", buffer);
printf("%d", strlen(buffer));
我已经将buffer给free掉了, 但是为什么执行printf("%s", buffer)还可以打印其中的内容啊, 执行printf("%d", strlen(buffer))结果打印100, 好像没有理由啊? 哪位高手能帮忙分析一下原因吗?
|
C语言是这样设计free的:
free函数只是释放指针指向的内容,而该指针仍然指向原来指向的地方,此时,指针为野指针,如果此时操作该指针会导致不可预期的错误。安全做法是:在使用free函数释放指针指向的空间之后,将指针的值置为NULL。
操作系统是这样使用内存的:
我们试想下面一种情况,如果一个进程频繁的申请、释放一个页面的话,必然会导致大量的系统调用,从而影响进程的效率。如果内存管理在进程释放一块内存时,不是直接返还给系统,而是将其cache住,留待下次分配使用,这样就可以减少系统调用的次数,从而提高进程的效率。它的代价是释放的内存不立刻返还给系统,以内存空间来换取进程的性能。
free函数只是释放指针指向的内容,而该指针仍然指向原来指向的地方,此时,指针为野指针,如果此时操作该指针会导致不可预期的错误。安全做法是:在使用free函数释放指针指向的空间之后,将指针的值置为NULL。
操作系统是这样使用内存的:
我们试想下面一种情况,如果一个进程频繁的申请、释放一个页面的话,必然会导致大量的系统调用,从而影响进程的效率。如果内存管理在进程释放一块内存时,不是直接返还给系统,而是将其cache住,留待下次分配使用,这样就可以减少系统调用的次数,从而提高进程的效率。它的代价是释放的内存不立刻返还给系统,以内存空间来换取进程的性能。
|
其实楼主可以讲代码简化:
在cygwin下,这段代码是可以正常打印”Hello csdn!“的。
推荐一本书,《嵌入式linux性能详解》,http://blog.chinaunix.net/u/30686
#include
#include
int main()
{
char *str=(char*)malloc(256);
strcpy(str,"Hello csdn!");
free(str);
puts(str);
return 0;
}
在cygwin下,这段代码是可以正常打印”Hello csdn!“的。
推荐一本书,《嵌入式linux性能详解》,http://blog.chinaunix.net/u/30686