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。