malloc后,再free 却出错

来源:互联网 发布:知乎提问要审核吗 编辑:程序博客网 时间:2024/06/03 14:51
昨天研究了,斐波那契函数,如下代码:
#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的时候出非法操作
原创粉丝点击