MD和MT混用的后果

软件架构师何志丹



dll操作stl对象时(如:std::stringstd::vector)崩溃,原因:在不同堆中申请、释放内存。如果一个dllstl为主要类库,这种情况必定发生。主要分如下几类:

1,导出函数出参使用了stl对象。

2,导出了类,此类有公有成员。可以通过笨办法解决,不设置公有变量,通过SetGet函数操作成员,工作量巨大。

 

1VC6 Debug测试崩溃的情况。

被调用方(dll)

调用方(exe)

是否崩溃

MDd

MDd

正常

MD

正常

MTd

崩溃

MT

崩溃

MD

MDd

正常

MD

MD

正常

MD

MTd

崩溃

MD

MT

崩溃

MTd

MTd

崩溃

Mt

崩溃

MDd

崩溃

MD

崩溃

MT

MTd

崩溃

Mt

崩溃

MDd

崩溃

MD

崩溃

结论:除了双方都是MDMDd,必定崩溃。

 

2VC6 Release版,不考虑MDdMTd

被调用方(dll)

调用方(exe)

是否崩溃

MD

MD

正常

MT

MD

正常

MD

MT

正常

MT

MT

正常

结论:双方都是Release版,不会崩溃。

 

3,开发环境VC6,被调用方Release版,调用方Debug版。

这种情况很常见,比如:使用第三方组件,第三方组件往往没Debug版,所以调试时,只能用Release版。

被调用方(dll)

调用方(exe)

是否崩溃

MD

MTd

崩溃

MDd,

崩溃

MT

MTd

崩溃

MDd

崩溃

结论:必定崩溃。

 

4,VC8(VS2005)Debug

被调用方(dll)

调用方(exe)

是否崩溃

MDd

MDd

正常

MDd

MTd

崩溃

MTd

MTd

崩溃

MTd

MDd

崩溃

5,VC8(VS2005)Release

被调用方(dll)

调用方(exe)

是否崩溃

MT

MT

崩溃

MT

MD

崩溃

MD

MT

崩溃

MD

MD

正常

6VC8(VS2005)被调用方Release,调用方Debug

被调用方(dll)

调用方(exe)

是否崩溃

MD

MD

崩溃

无需实验

 

终上所述:

Debug版都是MDdRelease版都是MD,才不会崩溃。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闻缺陷则喜何志丹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值