首页 新闻 搜索 专区 学院

_CtrIsValidHeapPointer

0
[待解决问题]

昨晚终于解决掉了一个折磨我两天的奇怪问题,问题的原因在哪里尚不清楚,所以重属瞎猫当死耗子,希望有经验的同仁能指点迷津。
问题是这样的,我有个程序(比较完善)需要增加功能,在其他工程中写好要增加的c++文件并且测试没有问题,然后添加到这个程序中去,
仅仅添加了一个cpp文件没有对原来的代码修改,也就是说这些新添加的代码没有使用到,编译没有问题,可是运行时问题出来了,
总是弹出错误提示:
Debug   Assertion   Failed!
File:dbgheap.c
Line:1011
Expression:   _CtrIsValidHeapPointer(pUserData)
我用到了一个静态zlib,这个信息是在zlib中的一个地方释放内存时(free)出现的,检查过要是释放的这块内存没有问题(是申请到的有效内存且没有重复释放)
反复简化(注视掉部分代码)新添加的文件,重新编译,再运行,照样出错,最后发现,如果新添加的这个文件中用到free就会出现这个问题。
原来的代码中是没有使用过free,所以重现这个问题的条件就比较清楚了:代码中有free就弹出这个提示。
百般无奈,尝试过把free换成delete把malloc换成new,不会弹出提示。试着把“#pragma comment(lib,”引入的lib转移到“Object/Library module”引入,问题也能解决了。
我目前用了第二种方法,算是问题解决了,问题的原因在哪里还不了解,感谢大家提出自己的见解。

崇山峻岭的主页 崇山峻岭 | 初学一级 | 园豆:200
提问于:2011-04-20 19:01
< >
分享
所有回答(1)
0

引用静态库时,DEBUG和Release分别对应应用应该就可以了,应为不用的编译模式地址的申请和释放是不同的

还有一个原因,现在的VS编译器对于空间的管理最好是在模块内完成,假如你在dll中申请,在exe程序中释放,运行时也会出现这个问题,原理上将这个方式是可以的,但对于内存的管理和维护不太一致,因此现在的CRT对这种方式都作为一个报错提示

2012 | 园豆:21056 (高人七级) | 2011-04-22 16:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册