[转] 调试错误 ASSERTE(_CrtIsValidHeapPointer(pUserData))

[http://blog.sina.com.cn/s/blog_4cca614d010007x9.html]

 

/*
* If this ASSERT fails, a bad pointer has been passed in. It may be
* totally bogus, or it may have been allocated from another heap.
* The pointer MUST come from the 'local' heap.
*/
1132: _ASSERTE(_CrtIsValidHeapPointer(pUserData));

 

(1) If you are developing multithread application, be sure to link it with the correct runtime library(/MD, /MT). That what "The pointer MUST come from the 'local' heap." means.
Check what "ruintime library" you use. It should be "Multi threaded (debug ) DLL"

 

(2) Not only must they match, they must both be DLL versions. If they're static versions, each piece (the exe and the dll) will have their own heap and the OP will still be deleting from mismatched heaps.


I'd also be suspicious of general design issues given the way the OP's main program is having to clean up for the dll.

 

You'll get this problem if you use two different run-time libraries, one to allocate the memory and one to de-allocate the memory. Open up the project settings dialog, switch to C/C++ tab, set Category to Code Generation and check the Use run-time library combo box. These must match in any modules that share the task of allocating and destroying memory.

 

只是把 调用程序 和 程序库 都编译成release就不会出现这个问题。

 

本质参考: [http://topic.csdn.net/u/20071116/09/cc675daa-0ab2-4952-99d0-98f3dd717439.html]

1,内存不能跨模块分配和释放,模块分配的内存必须由该模块自己来释放。应该在DLL中再加一个方法,比如MemRelease,主程序调用这个方法来释放内存。

2,就是绕过new和delete,用GlobalAlloc()和GlobalFree()的方法

 

自己:使用opencv 2.0 peopledetect.cpp 时,Debug版本出现该问题,通过更改 C/C++配置 运行时库 多线程调试 DLL (/MDd) 解决了问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值