VS里调用DLL内存问题
2016-05-04 11:27
387 查看
调了好长时间,先是解决DLL版本问题(调用的DLL是VC6编译的,找到源码用VS重新编译),然后就遇到了匪夷所思的运行时崩溃。。。期间认真考虑过换行。。。
debug版倒是很爽快,一运行就直接报错:_CrtIsValidHeapPointer(pUserData),定位在调用DLL类进行new的时候。
2. 之后跑debug,查到_CrtIsValidHeapPointer(pUserData)报错的原因([1]):如果DLL是用的静态链接(MT/MTd),那么DLL和调用它的程序使用不同的本地堆,当EXE操作DLL申请的内存(或者相反)就会出错(两者分配的堆栈句柄不同)。
解决方法有2种:
1)DLL里申请的内存,就在DLL里释放。
2)DLL和EXE都使用MDd(debug模式)或MD(release模式)编译。这样所有模块都会共享一个堆栈。
但我这里DLL是其他人写的,不好动代码,因此选择第二种方法。
3. 选择上述方法有个细节,对于debug模式,需要选择“在共享DLL中使用MFC”(这是个MFC工程),静态会报错;
对于release模式,两种都可以成功编译,但如果是静态编译,使用中还是会崩溃,但换成共享就没问题。这个目前我还没搞明白为什么,按理说这里只是选择是否将MFC相关的DLL编译进EXE。。。
[2] visual studio运行时库MT、MTd、MD、MDd的研究
[3] _CrtIsValidHeapPointer的问题
问题描述
程序(release版)在调用DLL的函数时会随机崩溃;但单步调试崩溃的概率较低,而且即使崩溃,每次也不在一个地方,只能确定大致在调用DLL的时候(尼玛),一般会定位在VS自带DLL的堆栈free等函数。debug版倒是很爽快,一运行就直接报错:_CrtIsValidHeapPointer(pUserData),定位在调用DLL类进行new的时候。
解决过程
1. 一开始没用debug调,看release以为是多线程没设计好导致的内存泄露,浪费了很长时间没找到问题。2. 之后跑debug,查到_CrtIsValidHeapPointer(pUserData)报错的原因([1]):如果DLL是用的静态链接(MT/MTd),那么DLL和调用它的程序使用不同的本地堆,当EXE操作DLL申请的内存(或者相反)就会出错(两者分配的堆栈句柄不同)。
解决方法有2种:
1)DLL里申请的内存,就在DLL里释放。
2)DLL和EXE都使用MDd(debug模式)或MD(release模式)编译。这样所有模块都会共享一个堆栈。
但我这里DLL是其他人写的,不好动代码,因此选择第二种方法。
3. 选择上述方法有个细节,对于debug模式,需要选择“在共享DLL中使用MFC”(这是个MFC工程),静态会报错;
对于release模式,两种都可以成功编译,但如果是静态编译,使用中还是会崩溃,但换成共享就没问题。这个目前我还没搞明白为什么,按理说这里只是选择是否将MFC相关的DLL编译进EXE。。。
参考
[1] VS调试程序_ASSERTE(_CrtIsValidHeapPointer(pUserData))崩溃的原因以及解决方法,_assertepuserdata[2] visual studio运行时库MT、MTd、MD、MDd的研究
[3] _CrtIsValidHeapPointer的问题
相关文章推荐
- Mysql分表和表分区详解
- twitter snow flake 雪花算法
- PhotoShop CS6 官方简体中文正式版原版+破解补丁下载
- logcat 类 控制打印
- POJ 3352 边双联通
- VS中为函数自动添加函数说明
- mac 恢复出厂设置
- 转HTTP协议 --- Cookie
- 对iOS图片保护的理解
- Activity启动模式详解
- 基于HBase的消息队列 HQueue
- Android Studio:Multiple dex files define Landroid/support/annotation/AnimRes
- 57-Palindrome Linked List
- 6、关于onfocus和onblur实现搜索框
- 源代码管理工具-SVN
- 关于echars折线图修改内容
- myeclipse10合成svn
- Java中发送Http请求Get、Post
- 网页定位导航
- HTML基础知识