STL 跨模組 呼叫 異常 解決

2021-09-06 11:53:38 字數 1824 閱讀 9338

1、不要用stl(std::string屬於stl)來跨模組傳輸資料,例如:dll(so)之間,dll(so)和exe(elf)之間。

解決方法:使用基本型別、陣列、結構體,或者使用下面文章中的方法。

2、不要跨模組申請和釋放記憶體。

解決方法:可以實現乙個介面來釋放,其他方法參考下面。

用了很久的dll也會出問題,而且他們用沒事,他們用的是vs2010未公升級,我懷疑是vs2010公升級sp1後和之前的stl已經有所不同。看來stl的版本和編譯選項的不同會導致crash。

**下面這篇文章也不錯,收藏之。

跨dll使用template/stl需要注意的問題

template 是個好東西啊 . 經典的 stl . 強悍的boost. 還有我自己寫的那個 ------- 該死的 ------- 資源管理器.

dynamic link也是個好東西啊. 在windows下叫dll, 在unix下叫so (share object) . 它能省下很多重新發布軟體帶來的麻煩.

對策: 千萬別別把你的stl 容器,模板容器在 dll 間傳來傳去 . 記住string也是....

你在dll的某個類裡宣告了乙個vector之類的容器. 而沒有顯式的寫這個類的構造和析構函式. 那麼問題又來了.

你這個類肯定有操作這vector的函式. 那麼這些函式會讓vecoter<>生成**. 這些**在這個dll裡都是一致的. 但是別忘了.你沒有寫析構函式...... 如果這個時候, 別人在外面宣告了乙個這樣的類.然後呼叫這個類的函式操作了這個vector( 當然使用者並不知道什麼時候操作了vector) . 它用完了這個類以後. 類被釋放掉了. 編譯器很負責的為它生成了乙份析構函式的**...... 聽好了.這份**並不是在 dll裡 ... . 事情於是又和1>裡的一樣了.... crash ......(可能還會伴隨著迷茫.....)

對策: 記得dll裡每個類,哪怕式構造析構函式式空的. 也要寫到cpp裡去. 什麼都不寫也式很糟糕的.....同時,更要把任何和記憶體操作有關的函式寫到 .cpp 裡...

以上兩個問題似乎都是比較容易的-----只要把**都寫到cpp裡去, 不要用stl容器傳來傳去就可以了.

那麼第三個問題就要麻煩的多.

如果你自己寫了乙個模板, 這個模板用了stl 容器..........

這個時候你該怎麼辦呢?

顯然你無法把和記憶體分配相關的函式都寫到.cpp裡去 . template的**都必須放到header file裡.....

對策: 解決這個問題的基本做法是做乙個stl 記憶體分配器 , 強制把這個模板裡和記憶體分配相關的放到乙個.cpp裡去.這個時候編譯這個cpp就會把記憶體分配**固定在乙個地方: 要麼是dll. 要麼是exe裡...

模板+動態鏈結庫的使用問題還很多. 要千萬留心這個陷阱遍地的東西啊

不要在dll或lib的匯出函式以string(cstring)作返回值

這是因為string和csting採用了copy-on-write技術,copy-on-write使用了「引用計數」,這是一種記憶體共享機制。

假設有乙個動態鏈結庫(叫mynet.dll或mynet.so)中有這樣乙個函式返回的是string類:

根 據函式的定義,我們知道函式是「值返回」的,所以,函式返回時,一定會呼叫拷貝建構函式,又根據string類的記憶體共享機制,在主程式中變數ip是和函式內部的那個靜態string變數共享記憶體(這塊記憶體區是在動態鏈結庫的位址空間的)。而我們假設在整個主程式中都沒有對ip的值進行修改過。那麼在當主程式釋放了動態鏈結庫後,那個共享的記憶體區也隨之釋放。所以,以後對ip的訪問,必然做造成記憶體位址訪問非法,造成程式crash。即使你在以後沒有使用到ip這個變數,那麼在主程式退出時也會發生記憶體訪問異常,因為程式退出時,ip會析構,在析構時就會發生記憶體訪問異常。

thinkphp 跨模組呼叫

專案簡介 測試專案名為tp3.0 訪問 localhost tp3.0 安裝環境 windows apache mysql php 模組分組 測試時將模組分為兩組home,admin,根據需求還可以新增更多分組,比如 home,admin,user,article。一 跨模組呼叫例項 簡介 在ind...

tp跨模組呼叫

在乙個模組的方法中,如果需要呼叫其他模組的方法 可以再方法中,直接new其他 模組名action 來得到 module new moduleaction 例 假設在user模組reg 方法中想呼叫wuliao模組的wu 方法 方法 1 wuliao new wuliaoaction wuliao w...

package跨模組呼叫

module包 logger模組 deflogger print logger logger main模組 from module import logger 這裡之所以要加from module 是因為在bin中執行查詢不到logger defmain logger.logger main bin...