读书人

关于free的疑问,该怎么解决

发布时间: 2012-06-09 17:16:42 作者: rapoo

关于free的疑问
对于不是由malloc等分配的变量,调用free释放会有什么问题?如:
#include<stdio.h>
char* wt();

main()
{
char *b=wt();
printf("==%s==\n", b);
free(b);
printf("==%d==%d==\n",sizeof(b),strlen(b));
b=wt();
printf("==%s==\n", b);
free(b);
printf("==%d==%d==\n",sizeof(b),strlen(b));
return;
}
char* wt()
{
static char a[10];
strcpy(a,"haha!");
return a;
}


通过测试运行正常,返回
==haha!==
==4==5==
==haha!==
==4==5==


[解决办法]
用free释放非堆中分配的内存肯定是不安全的,这样完全不合逻辑,因为将非堆中的地址当成堆中的地址,这块地址不知道是否已分配给该程序,如果已分配,你可能会在程序中丢失数据或对堆中内存二次释放,如果没分配,释放未分配的内存一般是会报错的,如VC6.0Debug下断言失败_CrtIsValidHeapPointer(pUserData),当然发行版中未必会失败,但这样仍然会有安全隐患。 如果这样的维护不是很麻烦,建议你还是修改!
[解决办法]
malloc和free是成对出现的,这两类函数是对内存中堆上空间的操作函数。通过这两类函数可以对堆上空间就行申请和释放。所以,free使用的对象是明确的。如果你去释放不是指向堆上的空间的指针,那么只能说这种操作是未定义的。未定义的操作,结果就不好说了。这样的代码危险性是很大的。
[解决办法]
不知道LZ为什么可以正常运行...难道说用的TC?
我的VS2010直接崩掉

Linux下直接段错误,然后吐核,你懂的

读书人网 >C语言

热点推荐