VS里调用DLL内存问题

调了好长时间,先是解决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。。。

参考

[3] _CrtIsValidHeapPointer的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值