打印

奇怪的Heap corrupt问题,_CrtIsValidHeapPointer失败

[复制链接]
楼主: guoyt
手机看帖
扫描二维码
随时随地手机跟帖
21
guoyt|  楼主 | 2010-7-30 21:49 | 只看该作者 回帖奖励 |倒序浏览
为什么啊?

使用特权

评论回复
22
wangpe| | 2010-7-30 21:52 | 只看该作者
在dll中提供释放的函数供exe调用,也就是分配和释放都要在一个dll中进行

使用特权

评论回复
23
guoyt|  楼主 | 2010-7-30 21:52 | 只看该作者
举个例子

使用特权

评论回复
24
wangpe| | 2010-7-30 21:57 | 只看该作者
void* CCyUSBDevice::Alloc()
{
return new char[20];
}
void CCyUSBDevice::Release(void *p)
{
delete [] p;
}

使用特权

评论回复
25
guoyt|  楼主 | 2010-7-30 21:58 | 只看该作者
我没有用到任何自己的DLL和第三方的DLL

使用特权

评论回复
26
guoyt|  楼主 | 2010-7-30 21:58 | 只看该作者
Cypress提供的是一个静态链接的lib,无DLL文件。

使用特权

评论回复
27
wangpe| | 2010-7-30 22:06 | 只看该作者
多试试

使用特权

评论回复
28
guoyt|  楼主 | 2010-7-30 22:06 | 只看该作者
改成multi byte就没问题了。

使用特权

评论回复
29
guoyt|  楼主 | 2010-7-30 22:06 | 只看该作者
刚刚分配完内存之后,_CrtMemBlockHeader::pBlockHeaderPrev == NULL,继续执行到准备释放时,这个值被改变了(其余的值都没有变),不过,即使在delete[]值钱,手动把这个值再改回NULL,调用delete[]还是会异常。

使用特权

评论回复
30
guoyt|  楼主 | 2010-7-30 22:11 | 只看该作者
刚刚又测试了一下,改用Multi-Byte,跟踪发现,,_CrtMemBlockHeader::pBlockHeaderPrev在准备释放之前,也是被改变了的,但是此时delete[]一切正常

使用特权

评论回复
31
langgq| | 2010-7-30 22:12 | 只看该作者
CrtMemBlockHeader::pBlockHeaderPrev被改变或许是正确的行为

使用特权

评论回复
32
guoyt|  楼主 | 2010-7-30 22:12 | 只看该作者
是啊,但为什么UNICODE环境下delete[]会失败呢?

使用特权

评论回复
33
lium| | 2010-7-30 22:13 | 只看该作者
跟CyUSB.lib有什么关系,建议你把分配和释放的代码都贴出来,你现在贴的不全,分配的地方没有贴。

使用特权

评论回复
34
llia| | 2010-7-30 22:18 | 只看该作者
LPTSTR lpszPathName = new char[_tcslen(lpszConfigFile)+1];
debug模式下的delete会检查释放的内存并将其填入0xcc。

使用特权

评论回复
35
yufe| | 2010-7-30 22:19 | 只看该作者
pBlockHeaderPrev改变是正常的

使用特权

评论回复
36
yufe| | 2010-7-30 22:19 | 只看该作者
你再检查一下是否存在越界问题,可能某个地方计算字符串的长度出错了。

使用特权

评论回复
37
hanwe| | 2010-7-30 22:20 | 只看该作者
也可能是你使用的lib在处理Unicode时存在问题。

使用特权

评论回复
38
guoyt|  楼主 | 2010-7-30 22:26 | 只看该作者
之所以提到CyUSB.lib,是因为该lib导出了一个类CyUSBDevice,我的类CEmuDevice继承自此类,CyUSB.lib是一个静态的library,而我的工程是/MDd的

使用特权

评论回复
39
guoyt|  楼主 | 2010-7-30 22:26 | 只看该作者
所以我怀疑是因为link到了不同的CRT库,导致在不同的堆,检查失败。

使用特权

评论回复
40
guoyt|  楼主 | 2010-7-30 23:01 | 只看该作者
在释放之前就出错了。DEBUG版本下,释放之前会进行堆校验,就是在这里出错的。故我想和填入0xCC没有关系。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则