您的位置:首页 > 其它

VS里调用DLL内存问题

2016-05-04 11:27 387 查看
调了好长时间,先是解决DLL版本问题(调用的DLL是VC6编译的,找到源码用VS重新编译),然后就遇到了匪夷所思的运行时崩溃。。。期间认真考虑过换行。。。

问题描述

程序(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的问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: