首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-06-09 
关于free的疑问对于不是由malloc等分配的变量,调用free释放会有什么问题?如:#includestdio.hchar* wt()

关于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下直接段错误,然后吐核,你懂的

热点排行