Cypress的USB库

[复制链接]
7035|39
 楼主| chuxh 发表于 2011-1-3 11:40 | 显示全部楼层
我没有用到任何自己的DLL和第三方的DLL
houcs 发表于 2011-1-3 11:54 | 显示全部楼层
哦,Cypress提供的是一个静态链接的lib,无DLL文件。
juventus9554 发表于 2011-1-3 12:12 | 显示全部楼层
改成multi byte 试试
 楼主| chuxh 发表于 2011-1-3 12:31 | 显示全部楼层
刚刚分配完内存之后,_CrtMemBlockHeader::pBlockHeaderPrev == NULL,继续执行到准备释放时,这个值被改变了(其余的值都没有变),不过,即使在delete[]值钱,手动把这个值再改回NULL,调用delete[]还是会异常。
 楼主| chuxh 发表于 2011-1-3 12:46 | 显示全部楼层
刚刚又测试了一下,改用Multi-Byte,跟踪发现,,_CrtMemBlockHeader::pBlockHeaderPrev在准备释放之前,也是被改变了的,但是此时delete[]一切正常
zwll 发表于 2011-1-3 13:09 | 显示全部楼层
CrtMemBlockHeader::pBlockHeaderPrev被改变或许是正确的行为
 楼主| chuxh 发表于 2011-1-3 13:32 | 显示全部楼层
是啊,但为什么UNICODE环境下delete[]会失败呢?
juventus9554 发表于 2011-1-3 13:38 | 显示全部楼层
跟CyUSB.lib有什么关系,建议你把分配和释放的代码都贴出来,你现在贴的不全,分配的地方没有贴。
司徒老鹰 发表于 2011-1-3 14:39 | 显示全部楼层
LPTSTR lpszPathName = new char[_tcslen(lpszConfigFile)+1];
debug模式下的delete会检查释放的内存并将其填入0xcc。
pangb 发表于 2011-1-3 15:00 | 显示全部楼层
pBlockHeaderPrev改变是正常的
llljh 发表于 2011-1-3 15:24 | 显示全部楼层
你再检查一下是否存在越界问题,可能某个地方计算字符串的长度出错了。
zwll 发表于 2011-1-3 15:47 | 显示全部楼层
也可能是你使用的lib在处理Unicode时存在问题。
 楼主| chuxh 发表于 2011-1-3 16:00 | 显示全部楼层
之所以提到CyUSB.lib,是因为该lib导出了一个类CyUSBDevice,我的类CEmuDevice继承自此类,CyUSB.lib是一个静态的library,而我的工程是/MDd的
morrisk 发表于 2011-1-3 16:19 | 显示全部楼层
所以你怀疑是因为link到了不同的CRT库,导致在不同的堆,检查失败?
 楼主| chuxh 发表于 2011-1-3 16:41 | 显示全部楼层
在释放之前就出错了。DEBUG版本下,释放之前会进行堆校验,就是在这里出错的。故我想和填入0xCC没有关系。
houcs 发表于 2011-1-3 16:56 | 显示全部楼层
unicode下LPCTSTR 和LPTSTR是不同的,需要进行转换。
 楼主| chuxh 发表于 2011-1-3 17:17 | 显示全部楼层
似乎不存在越界,我的程序对lpszPathName指向的内存的处理流程很简单,就是在UI线程中new,传递给worker thread,worker thread调用CEmuDevice的一个成员函数对字符串所表示的文件进行处理(该字符串表示了一个文件的路径),随即就delete[]之。
小小猫咪 发表于 2011-1-3 17:38 | 显示全部楼层
你跟踪过试试了吗?
 楼主| chuxh 发表于 2011-1-3 18:02 | 显示全部楼层
该字符串在new之后,delete之前,并没有发生变化,唯一的变化就是pBlockHeaderPrev改变了。
juventus9554 发表于 2011-1-3 18:28 | 显示全部楼层
可以先注释掉一部分代码,确定问题与哪里的代码有关。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部