关于申请内存后释放出错。。。。。。。。。 为什么要用malloc和free用new和delete[]不行吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用new和delete[],可能一样出错,你检查一下,Resoursr有没有用到“别人”分配的内存如果是“别人”分配的内存,当然不该由你来释放 Resourstr的内存区域可能还有程序在使用,也许Resourstr是别的程序申请的,你释放就会出错! may relate to the function:BinToCHex(Resourstr,(unsigned char*)LPCTSTR(str1),len); if resourstr is changed in this function, you are unable to free it. free 不应该出错的,你确定 BinToCHex 函数使用的缓冲区长度足够吗? 怎么会呢?Resourstr= (unsigned char *)malloc(len);不是新分配的内存吗?用new和delete,确实一样出错. smint(smint):谢谢你!resourstr 的内容在调用函数前后肯定会改变的,可是地址没变呀应该和内容没关系吧你觉得呢 先看一下Resourstr是不是NULL,如果是也许申请没成功(Resourstr置NULL)仔细查一下BinToCHex(Resourstr,(unsigned char*)LPCTSTR(str1),len);把BinToCHex(Resourstr,(unsigned char*)LPCTSTR(str1),len);也贴出来好了,光这么看可能看不出来吧 兄弟你很幸运啊!既然能报告错误,有时不会报告这样的错误的,但是确实存在很严重的错误啦!CString str = _T("You are pig!");str.GetLength()返回的是12,但是占用的内存是#ifdef _UNICODE占用(12+1)*sizeof(TCHAR),即26Byte#else占用(12+1),即13个Byte#endif现在明白了吧?!分配的内存不够,你破坏了内存块的信息了!所以导致free错误! lvxn_sina(XN) :针对我的例子而言,我把 len替换成数字100也还是出错呀BinToCHex是封装在dll里的,没法贴出来 将Resourstr= (unsigned char *)malloc(len);改成Resourstr= (unsigned char *)malloc(len+1);就对了! 靠!!!/* 二进制数转化为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的内存了!!!!!!!!!!!!!!! 呵呵,我昨晚刚解决了类似的一个问题。最起码,从你的代码来看,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! len=str1.GetLength()+1;试试该成上面的,CString的GetLength()返回的是不包括‘0’的长度,unsigned char * Resourstr;Resourstr是以‘0’结尾的字符串,一直要找到‘0’为止,释放时如果Resourstr[len]!=0则Resourstr的长度会大于len,出错。 请教关于TabCtrl自绘的方法。 列表控件的一个问题! 搞了多年的.net,回过来再搞vc++,有必要吗 主程序和登陆对话框的显示次序问题,立即给分 出售视频聊天代码! 谁能帮我分析一这两段代码!!!!!!!!!!!!!!!!!!!!!1111 光盘自动运行程序 这个问题,一个星期没搞定。求高手。 一个Win98安装问题 高分请教小问题!!! 如何在程序中获得某个CEdit控件是多行属性的? 我想找出所有笔画数为15的繁体汉字,有什么办法呢?
你检查一下,Resoursr有没有用到“别人”分配的内存
如果是“别人”分配的内存,当然不该由你来释放
Resourstr= (unsigned char *)malloc(len);
不是新分配的内存吗?用new和delete,确实一样出错.
谢谢你!
resourstr 的内容在调用函数前后肯定会改变的,可是地址没变呀
应该和内容没关系吧
你觉得呢
仔细查一下BinToCHex(Resourstr,(unsigned char*)LPCTSTR(str1),len);
把BinToCHex(Resourstr,(unsigned char*)LPCTSTR(str1),len);也贴出来好了,光这么看可能看不出来吧
str.GetLength()返回的是12,但是占用的内存是
#ifdef _UNICODE
占用(12+1)*sizeof(TCHAR),即26Byte
#else
占用(12+1),即13个Byte
#endif
现在明白了吧?!
分配的内存不够,你破坏了内存块的信息了!所以导致free错误!
针对我的例子而言,我把 len替换成数字100也还是出错呀BinToCHex是封装在dll里的,没法贴出来
改成Resourstr= (unsigned char *)malloc(len+1);
就对了!
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的内存了!!!!!!!!!!!!!!!
最起码,从你的代码来看,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!
试试该成上面的,CString的GetLength()返回的是不包括‘0’的长度,unsigned char * Resourstr;Resourstr是以‘0’结尾的字符串,一直要找到‘0’为止,释放时如果Resourstr[len]!=0则Resourstr的长度会大于len,出错。