DLL的灾难 --- DEBUG与RELEASE版本不能交叉调用

博客探讨了DLL与Exe之间Release与Debug版本交叉调用出现错误的原因,主要是Debug和Release下模块导入地址、堆内存管理方式不同,易引发运行时错误。解决方法是debug调用debug版,release调用release版,DLL互相调用时也需统一版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

让我们先看一段引文,再来进行心灵的探索:

If you have an EXE and a DLL.
When your exe APP was built Debug Mode, your Dll must be Debug mode. 
When your exe APP was built Release Mode, your Dll must be Release mode. 
If exe is Release Mode and Dll is Debug Mode, Error. 
If exe is Debug Mode and Dll is Release Mode, Error.

-------------------------------- Why? --------------------------------
Looks like you have a problem with memory allocation.
When an application is built in debug mode it does not allocate memory from the same heap as it does in release mode.(have a look to the definition of new and delete operator, and also to malloc (in afxmem.h ? (not sure just grep it))
Thus, when you get some memory from your debug app and give this memory to your release dll for processing and FREEING,you get an error since the realase dll tries to free it from the wrong heap. So always use your app and dll in the same mode. 
At least, do not try to free memory allocation in one mode in the other mode.

现在,我们来概括一个结论:

1、之所以,Dll与Exe之间进行Release与Debug的交叉调用会出现错误,一个非常重要的原因,可能是由于Debug下与Release下,模块的导入地址是不一样的,即使你取消所有的优化,也许也并不能改变这样的结局。 从而对于一个在Exe(假如是Release版本)中生成的对象(比如一个静态的全局数组),与一个在Dll中生成的对象可能会位于完全不同的内存区域,从而对那些借助于对静态指针的值进行判断的类(比如CString)跨模块调用的时候,一旦出现判断,将会出现严重的逻辑错误,从而使一块本不该被释放的内存被释放,从而引发运行时的错误。
解决交叉调用的最简单,最合理的方法就是: debug调用debug版,release调用release版,这也许就是模块化中的一个瑕疵吧。

2、 其实跨模块调用dll内部静态字符数组还是没问题的,只不过你返回的对象如果本身内部有内存分配就尴尬了,debug和release的堆内存管理方式不同。用release生成的带内存分配的临时对象被在debug工程里销毁,就会因为内存管理方式不一致而出错。

3、如果DLL1和DLL2都是release或都是debug版本,调用是不会报错的。

而本人用的是debug的DLL1,调用release的DLL2。导致在该行报错。

所以在DLL互相调用的时候,一定要统一版本。混合调用很容易出现奇怪的问题。

4、姊妹篇

动态库*.dll文件的Debug/Release版本是否可以混用(交叉用)?_libaineu2004的博客-CSDN博客_debug和release混用

---

参考文献

DLL的灾难 --- DEBUG与RELEASE版本不能交叉调用_cary516843761的博客-CSDN博客

debug版本的DLL调用release版本的DLL引发的一个问题 - bigfi - 博客园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值