为什么要用malloc和free用new和delete[]不行吗?

解决方案 »

  1.   

    用new和delete[],可能一样出错,
    你检查一下,Resoursr有没有用到“别人”分配的内存
    如果是“别人”分配的内存,当然不该由你来释放
      

  2.   

    Resourstr的内存区域可能还有程序在使用,也许Resourstr是别的程序申请的,你释放就会出错!
      

  3.   

    may relate to the function:BinToCHex(Resourstr,(unsigned char*)LPCTSTR(str1),len);
      

  4.   

    if resourstr is changed in this function, you are unable to free it.
      

  5.   

    free 不应该出错的,你确定 BinToCHex 函数使用的缓冲区长度足够吗?
      

  6.   

    怎么会呢?
    Resourstr= (unsigned char *)malloc(len);
    不是新分配的内存吗?用new和delete,确实一样出错.
      

  7.   

    smint(smint):
    谢谢你!
    resourstr 的内容在调用函数前后肯定会改变的,可是地址没变呀
    应该和内容没关系吧
    你觉得呢
      

  8.   

    先看一下Resourstr是不是NULL,如果是也许申请没成功(Resourstr置NULL)
    仔细查一下BinToCHex(Resourstr,(unsigned char*)LPCTSTR(str1),len);
    把BinToCHex(Resourstr,(unsigned char*)LPCTSTR(str1),len);也贴出来好了,光这么看可能看不出来吧
      

  9.   

    兄弟你很幸运啊!既然能报告错误,有时不会报告这样的错误的,但是确实存在很严重的错误啦!CString str = _T("You are pig!");
    str.GetLength()返回的是12,但是占用的内存是
    #ifdef _UNICODE
    占用(12+1)*sizeof(TCHAR),即26Byte
    #else
    占用(12+1),即13个Byte
    #endif
    现在明白了吧?!
    分配的内存不够,你破坏了内存块的信息了!所以导致free错误!
      

  10.   

    lvxn_sina(XN) :
    针对我的例子而言,我把 len替换成数字100也还是出错呀BinToCHex是封装在dll里的,没法贴出来
      

  11.   

    将Resourstr= (unsigned char *)malloc(len);
    改成Resourstr= (unsigned char *)malloc(len+1);
    就对了!
      

  12.   

    靠!!!/* 二进制数转化为16十六进制字符串 
    asc:十六进制字符串,如"1234E1FA"
    bin:二进制结果串: 0x12,0x34,0xE1,0xFA
    len:二进制串长unsigned char * pascal BinToCHex(unsigned char *asc, unsigned char *bin,unsigned short len);
    */
    根据你的说明,BinToCHex(Resourstr,(unsigned char*)LPCTSTR(str1),len);
    这种用法就不对!!这是将Resourstr结果显示在str1中!!!
    str1应该分配内存!!!分配内存时不能用CString进行!!!!正确的方法是:
             CString str1="中国人民银行",str2;
    int len;
    len=str1.GetLength();

    unsigned char * Resourstr;
    Resourstr= (unsigned char *)malloc(len*3 +1); 
             // 每个Asc码用了3BYTE!!!!
    BinToCHex((unsigned char*)LPCTSTR(str1),Resourstr, len*3);
    str2=Resourstr;
    AfxMessageBox(str2);
    这样就可以了。。你原来破坏了str1的内存了!!!!!!!!!!!!!!!
      

  13.   

    呵呵,我昨晚刚解决了类似的一个问题。
    最起码,从你的代码来看,str2的最后长度不可能刚好是len的值!
    建议你试一下:
    unsigned char * Resourstr;
    Resourstr= (unsigned char *)malloc(len + 1); BinToCHex(Resourstr,(unsigned char*)LPCTSTR(str1),len);
             Resourstr[len] = '\0';//否则跟后面的内存块连在一起了。
    str2=Resourstr;
    AfxMessageBox(str2); free(Resourstr);//不应该出错!Good Luck!
      

  14.   

    len=str1.GetLength()+1;
    试试该成上面的,CString的GetLength()返回的是不包括‘0’的长度,unsigned char * Resourstr;Resourstr是以‘0’结尾的字符串,一直要找到‘0’为止,释放时如果Resourstr[len]!=0则Resourstr的长度会大于len,出错。