天天看點

MD和MT混用的後果

軟體架構師何志丹

跨dll操作stl對象時(如:std::string、std::vector)崩潰,原因:在不同堆中申請、釋放記憶體。如果一個dll以stl為主要類庫,這種情況必定發生。主要分如下幾類:

1,導出函數出參使用了stl對象。

2,導出了類,此類有公有成員。可以通過笨辦法解決,不設定公有變量,通過Set和Get函數操作成員,工作量巨大。

1,VC6 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 崩潰

結論:除了雙方都是MD或MDd,必定崩潰。

2,VC6 Release版,不考慮MDd和MTd。

被調用方(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 正常

6,VC8(VS2005)被調用方Release,調用方Debug。

被調用方(dll) 調用方(exe) 是否崩潰
MD MD 崩潰
無需實驗

繼續閱讀