軟體架構師何志丹
跨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 | 崩潰 |
無需實驗 |