當選擇multi-threaded或者multi-threaded debug靜態編譯時,請注意,編譯器會為該dll單獨實現一個c++
運行庫環境。這時,exe文件或者其他dll文件也使用靜態編譯等的時候,編譯器又會實現多個c++運行庫環境。在這個時侯,(由于微軟的stl實現基于引用計數,)多個運行庫的存在,就可能導致引用計數的錯誤(因為各個運行庫分別計數)。
直接導致的問題就是,如果dll導出函數輸入或者輸出數據類型中使用了stl類時,程序有可能因為引用計數的問題而過早析構該對象,而導致后續訪問野指針,應用程序崩潰。
所以當你選擇靜態編譯的時候,記住返回的函數或者輸入的參數,都不要使用stl類對象,否則程序將不穩定。
C++代碼
-
- std::string getString();
-
- void getString( std::string&);
-
- void setString( const std::string&);
其他stl類庫也都一樣,不能作為輸入或者輸出的數據類型。
注:動態編譯不會有這個問題,因為大家共享同一個C++運行庫。