读书人

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

发布时间: 2012-05-04 12:36:09 作者: rapoo

关于用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; // 改变了

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

读书人网 >C语言

热点推荐