while循环中的malloc与free出错
本帖最后由 flappingwings 于 2014-05-23 15:07:04 编辑
各位大神:
int num_non_zero = 0;
int *Ai = NULL;
double *Ax = NULL;
....
while(iteration_flag)
{
1. 计算num_non_zero的值,对于每次迭代,num_non_zero值不同,代码省略;
2. 为Ai和Ax分配内存
Ai = (int *)malloc(num_non_zero * sizeof (int));
if (!Ai) printf("Allocation problem for Ai !!!");
Ax = (double *)malloc(num_non_zero * sizeof (double));
if (!Ax) printf("Allocation problem for Ax !!!");
3. 计算Ai与Ax中各元素的值,代码省略;
4. 使用Ai与Ax进行计算,代码省略;可以确定的是在计算过程中不会改变Ai与Ax的指向;
5. 释放Ai与Ax的内存,随后将它们设置为NULL;
free(Ai); Ai = NULL;
free(Ax); Ax = NULL;
}
问题:在visual studio 2013中编译之后运行这段程序时,会产生错误,检查之后发现如果去掉第5步中的Ai=NULL和Ax=NULL之后,程序可以运行,但偶尔还是会产生free错误,请问各位大神,可能的原因是啥?如何修改呢?非常感谢!
------解决方案--------------------
感觉会不会是malloc失败?给if加上else,在else中free并置NULL试试
------解决方案--------------------
free失败无非这两种情况:
1 内存越界,free的时候free多了。检查中间任何和内存写有关的地方。这种问题一般是必现
2 内存破坏,相邻的内存越界。检查所有内存拷贝和内存写的地方。这种问题一般非必现。
楼主的应该是内存破坏。你在调试状态,把出错的指针在memory里,看看相邻内存里的内容是啥
------解决方案--------------------
仅供参考//使用动态分配
#include
#include
#include
int i,L;
char *p;
void main() {
for (i=0;i<20000;i++) {
L=rand();
p=malloc(L);
if (NULL==p) {
printf("malloc error!\n");
continue;
}
memset(p,0,L);
free(p);
}
}
//不使用动态分配
#include
#include
#include
#define MAXLEN 30000
int i,L;
char buf[MAXLEN];
char *p;
void main() {
p=&buf[0];
for (i=0;i<20000;i++) {
L=rand();
if (L>MAXLEN) {
printf("L>MAXLEN==%d, ignore spilth.\n",MAXLEN);
L=MAXLEN;
}
memset(p,0,L);
}
}