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

关于用free释放空间解决方法

2012-05-04 
关于用free释放空间main(){chat *ss (char*)malloc(2*sizeof(char))//开辟了空间scanf(%s,s)while(

关于用free释放空间
main()
{
  chat *s;

  s = (char*)malloc(2*sizeof(char));//开辟了空间
  
  scanf("%s",s);

  while(*s)
 {
  s --;
 }

  free(s);//经过while后,*s=“”,为空
}

  这是可否还要free?
  可是,当我运行free(s)之后,会出来一堆东西有:
  backtrace
  memory map 等等
  这是怎么回事?这些提示是什么意思?

[解决办法]
你用malloc在堆空间申请了一块内存,现在你把唯一的指针指向了字符串的末尾,现在进行释放内存操作,肯定出问题啦。free又不知道你想从哪里开始释放的。
[解决办法]
s指针指的不是初始位置了,在用之前把初始位置保存起来:
char *p = s;
...

if (p)
{
free(p);
}

[解决办法]
这是属于溢出。如果s不是指向了开始申请的空间的首地址。那么调用free函数很可能会出现内存溢出的情况。还要注意的是使用malloc后一定要检查是否内存申请成功。如果malloc不成功,s会指向NULL。

C/C++ code
main(){  chat *s;  s = (char*)malloc(2*sizeof(char));//开辟了空间   if (s == NULL) {     fprintf(stderr, "malloc failed");     exit(EXIT_FAILURE);  }  char *p = s;     scanf("%s",s);  while(*s) {  s --; }  free(p);   /*这样是没问题的*/}
[解决办法]
backtrace是你在操作内存的时候,出现了内存操作错误,系统会启动backtrace讲调用的函数栈信息打印出来,你可以根据这个调用关系分析哪里出错了。

还有就是你只能释放你自己申请的空间,不能随便释放别人申请的空间。释放空间要明白现在这个空间是否要释放,位置是否正确,否则胡乱释放会对系统有影响。
[解决办法]
int i = 10;
int* a = (int*)malloc(sizeof(int) * 10);
a = &i; // 改变了

这时候,你原来分配的内存就收不回来了

热点排行