昨天研究了,斐波那契函数,如下代码:
#include "stdio.h"
#include "malloc.h"
long phponach(int n);
unsigned long phbonache(int n);
int main(int argc, char* argv[])
{
int nRet= 0;
nRet = phponach(10);
printf("%d ",nRet);
for (int i=1; i<= 10; i++)
{
printf("%d ",phponach(i));
}
printf("\n");
printf("%X \n", phbonache(10));
printf("Hello World!\n");
return 0;
}
//方法一
long phponach(int n)
{
if (n==1)
{
return 1;
}
else if ( n==2)
{
return 1;
}
else
{
return phponach(n-1)+ phponach(n-2);
}
}
//方法二
unsigned long phbonache(int n)
{
unsigned long temp;
int * p = (int *)malloc(sizeof(unsigned long)*n);
*(p+0) = 1;
*(p+1) =1;
for (int i=2; i<=n; i++)
{
p[i]= p[i-1]+p[i-2];
}
temp = *(p+n-1);
if (p != NULL)
{
free(p);//?
}
return temp;
}
第一种方法当然是没有问题了,但是求一个100项的斐波那契,很慢,至少我的电脑很长时间没有算出来,
而第二种方法,速度是快,但是我的问题不是这个了,是当程序运行到free(p)的时候,就出错了?
这个问题,如何解决呢??
////////////////正在研究中,已找到答案
原因:分配的数组空间不够,
应该这样改:
int * p = (int *)malloc(sizeof(unsigned long)*(n+1));
也就是下面说的第6条;
///////////////////////////////////////////////////////////////////
在解决这个问题的过程中,我查了一些关于,molloc和free函数应该注意的东西:
下面总结一下:
1,不要Free二次,配套使用
2,不要跨进程分配和释放;
不要free多次或0次;
注意判断分配是否成功;
3,对于malloc()和free()需要注意的,补充一句,为了确保对于一个有效指针只free一次,所以应该在malloc返回失败、free指针以后都因该把指针置空,而在free前应该判断指针是否为空!只要按照这种方式去写代码应该是没问题的!
4,在一个函数里边malloc了一个指针,然后返回值是这个指针,也需要free
5,指向malloc申请的堆内存的指针
在运用过程中千万不要另付值
否则同样导致内存泄露
6,malloc后,实际使用时指针长度超过了你申请的范围。
当再去free时肯定出问题!
------------------------------------------------------------------
附加:new 和delete的,网上的一个例子:
问题:
我用这种方式分配空间以后 在free掉就出问题了,报 非法操作 天阿 怪事年年有 今年特别多阿!大哥们 救救俺吧!
unsettled_buf=(char *)malloc(ordernumber * 60);
order = new ORDER[ordernumber];
.................
..................
..................
delete order;
free(unsettled_buf);
free就出问题了!?》》》》》》???、
解答:
1,你的delete用的不对,对于数组应该delete []ordrer
不论何种时候delete []ordrer总不会错,这是个好习惯
2,如果ORDER是一个类或结构, 就必须用delete[] order~~
3,可能在中间的运算时使用超出了unsettled_buf范围的指令,把內存的控制块破坏了,但這個Byte是可讀可寫的, 所以不會引起即時的錯誤(但已種下了一個陷井), 當free固內存時, 由於內存控制塊已被破壞, 所以發生"DAMAGE: after Normal block (#25)"錯誤.
4,原因: 原来是楼主操纵了这个char *的地址所以free的时候出非法操作
阅读(1213) | 评论(0) | 转发(0) |