在一个类中使用了一些用malloc()分配的指针. 形式为:
LPBYTE pData = (unsigned char*) malloc(nSize);
用在初始化的时候分配空间, 然后在析构函数中free.此时一切OK. 但是在一个函数中需要不断的malloc并在这个函数中free. 然后问题就出来了. 当计算完成,要退出该类时调用析构函数中的free,此时报告free出错. 但在这个函数中并没有处理free出错的指针.不知道是什么原因. 大家给点意见.

解决方案 »

  1.   

    malloc是申请一个内存空间,用完后要free一下,就是归还
    申请了几个就归还几个,
      

  2.   

    free出错只有一个原因,free的地址绝对不是曾经malloc过的,就是说pData在这个过程中值被改变了
      

  3.   

    声明一个指针变量,必须先赋值,或者赋为空(free时不会出错,否则会出错),在你的函数开始时,先free,然后malloc,函数结束时执行free,然后将指针赋为NULL.避免产生野指针,或者free出错的情况。
      

  4.   

    你把可能出现问题的地方ASSERT一
      

  5.   

    就搂主这种情况,ASSERT只能在使用空指针时报错,但是在使用完一个指针并且执行free后,ASSERT并不能预防指针非法操作,free操作后指针不是一空值,但是非法值。
      

  6.   

    同意楼上n多人的看法。
    要注意养成习惯,free一个指针以后一定要记得置成NULL,使用前也一定要记得检查是否为空。
    你可以自己跟踪一下程序,看看最后一次malloc得到的地址和free的时候的地址是否符合
      

  7.   

    它的用法和new/delete一样一定要对应,再者每次用完后都要给指针赋空值防止野指针出现,malloc/free和new/delete最大的区别就是new/delete不但可以分配内存空间(释放内存),还可以调用构造函数(析构函数)。
      

  8.   

    malloc要和free对应还有,
    LPBYTE pData = (unsigned char*) malloc(nSize);
    还有,在使用free时,必须保证free(p) 中的地址和pData 相同
      

  9.   

    malloc 和free多了就容易出现问题
      如果控制的对的话就应该没事,可能是free的时候那空间已经不存在了。
      

  10.   

    问题找出来了. 大家说的都很对,需要注意的有几点:
    1) malloc()与free()、new()与delete[] 必须对应。
    2)在malloc指针之前,必须将指针置为NULL。
    3)为了保险起见,free后, 仍将指针置为NULL。
    ======原因上面XD们说的很清楚了
    保证了上面的三点后,用qrlvls(≌AIR⌒LIKE) (≤和空气一样帅≥√)家伙说的话是:“仔细”!!!
      

  11.   

    LPBYTE pData = (unsigned char*) malloc(nSize);
    在使用free时,必须保证free(p) 中的地址和pData 相同
      

  12.   

    LPBYTE pData = 就不是成员变量了,如果pData在头文件中定义了,那么去掉分配地方的LPBYTE
    建议成员变量前加m_
      

  13.   

    2)在malloc指针之前,必须将指针置为NULL。这个无所谓的吧?
      

  14.   

    确实呀,不用的时候最好将指针甚至为NULL
      

  15.   

    严重同意:指针初始化为NULL,并且在free之后,必须将指针置为NULL。
    在这种地方坚持严谨的风格是可以提高软件质量的。
      

  16.   

    malloc是申请一个内存空间,用完后要free一下,就是归还
    申请了几个就归还几个,要一一对应!
      

  17.   

    俺只用new delete 
    up!!!!
      

  18.   

    1) malloc()与free()、new()与delete[] 必须对应。
    2)在malloc指针之前,必须将指针置为NULL。
    3)为了保险起见,free后, 仍将指针置为NULL。!!!