软件架构师何志丹



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,才不会崩溃。

posted on 2023-04-28 02:04  闻缺陷则喜何志丹  阅读(100)  评论(0编辑  收藏  举报  来源