专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > C语言

这段malloc和free的代码错在哪里?另外关于内存释放?解决思路

发布时间:2011-06-28 15:23:02 文章来源:www.iduyao.cn 采编人员:星星草
这段malloc和free的代码错在哪里?另外关于内存释放?
int *pi1; pi1=(int *)malloc(10*sizof(int));  
  int *pi2; pi2=pi1+1; free(pi1); free(pi2);  
看到以前有一个帖子,有人回答说free(pi1);free(pi2)会出问题?
我没看出来那里有问题,请高手解答!

另外,如果用malloc申请了一段内存空间,就像上面的,free他的时候,是直接free(pi1)呢?还是要一个一个的free?
我认为应该是一个一个的free,但我们老师给了一段代码:

typedef struct
{
 ElemType *elem;//基地址
 int length;//表长
 int listsize;//目前表长
} SqList;
int InitList_Sq(SqList &L)
{  
L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)exit(OVERFLOW); //存储分配失败
L.length=0; //空表长度为0
L.listsize=LIST_INIT_SIZE; //初始存储容量
return OK;
}//InitList_Sq 
//销毁顺序表
void DestroyList_Sq( SqList &L)
{
  // 释放顺序表 L 所占存储空间
  free(L.elem); //这里,他直接释放了基地址,而不是一个一个释放的,为什么?这样对吗?
  L.listsize = 0;
  L.length = 0;
}// DestroyList_Sq

难道是老是错了?
不解!
请高手指点!

------解决方案--------------------
C/C++ code

int *pi1;
int *pi2;
  pi1 = (int *)malloc(10*sizof(int));       
  pi2 = pi1 + 1;  // 将pi2指向pi1申请的连续内存的第二个位置
  free(pi1);      // 将pi1申请的连续10个整数size的内存释放,包含pi2指向的内存空间
  free(pi2);      // 重复释放已经释放的内存

------解决方案--------------------
第二个问题,直接释放就可以了
------解决方案--------------------
int *pi1; pi1=(int *)malloc(10*sizof(int));
int *pi2; pi2=pi1+1; free(pi1); free(pi2);
看到以前有一个帖子,有人回答说free(pi1);free(pi2)会出问题? 

因为 pi2 不是通过malloc获得地址空间的,
所以 free(pi2); 会出错。
------解决方案--------------------
//这里,他直接释放了基地址,而不是一个一个释放的,为什么?这样对吗? 

注意到 L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); 
这里是一次malloc,
那么对应的就是一次 free, 没有问题。


一个最简单原则,
多少次malloc, 多少次free
------解决方案--------------------
错在 sizeof 写错了。
错在 错位释放了
------解决方案--------------------
free(L.elem); //这里,他直接释放了基地址,而不是一个一个释放的,为什么?这样对吗? 

这个注意看你老师在构造联表时的意图
他一次分配了足够的顶量的节点
所以在释放时一次释放掉

他不是在增加节点时动态分配的
而是第一次就分配足够多的
------解决方案--------------------
malloc和free需要成对出现的

------解决方案--------------------
看看这里http://www.ibm.com/developerworks/cn/linux/l-memory/
------解决方案--------------------
申请了多少次就释放多少次呗。

malloc又不知道你申请来的内存是用来做数组的,还是做链表的,或只是一大块buffer。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: