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