关于用free释放空间解决方法
关于用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。
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; // 改变了
这时候,你原来分配的内存就收不回来了