當(dāng)選擇multi-threaded或者multi-threaded debug靜態(tài)編譯時(shí),請(qǐng)注意,編譯器會(huì)為該dll單獨(dú)實(shí)現(xiàn)一個(gè)c++
運(yùn)行庫(kù)環(huán)境。這時(shí),exe文件或者其他dll文件也使用靜態(tài)編譯等的時(shí)候,編譯器又會(huì)實(shí)現(xiàn)多個(gè)c++運(yùn)行庫(kù)環(huán)境。在這個(gè)時(shí)侯,(由于微軟的stl實(shí)現(xiàn)基于引用計(jì)數(shù),)多個(gè)運(yùn)行庫(kù)的存在,就可能導(dǎo)致引用計(jì)數(shù)的錯(cuò)誤(因?yàn)楦鱾€(gè)運(yùn)行庫(kù)分別計(jì)數(shù))。
直接導(dǎo)致的問(wèn)題就是,如果dll導(dǎo)出函數(shù)輸入或者輸出數(shù)據(jù)類(lèi)型中使用了stl類(lèi)時(shí),程序有可能因?yàn)橐糜?jì)數(shù)的問(wèn)題而過(guò)早析構(gòu)該對(duì)象,而導(dǎo)致后續(xù)訪問(wèn)野指針,應(yīng)用程序崩潰。
所以當(dāng)你選擇靜態(tài)編譯的時(shí)候,記住返回的函數(shù)或者輸入的參數(shù),都不要使用stl類(lèi)對(duì)象,否則程序?qū)⒉环€(wěn)定。
C++代碼
-
- std::string getString();
-
- void getString( std::string&);
-
- void setString( const std::string&);
其他stl類(lèi)庫(kù)也都一樣,不能作為輸入或者輸出的數(shù)據(jù)類(lèi)型。
注:動(dòng)態(tài)編譯不會(huì)有這個(gè)問(wèn)題,因?yàn)榇蠹夜蚕硗粋€(gè)C++運(yùn)行庫(kù)。