vector作為引數傳遞到dll問題

2021-06-27 04:38:47 字數 2039 閱讀 7990

最近的乙個專案中遇到了呼叫別人的sdk介面(dll庫)而傳給我的是乙個vector指標,用完之後還要我來刪除的情況。這個過程中首先就是在我的exe中將其vector指標轉為相應指標再獲取vector中相應的資料問題,始終都獲得不了正確的資料,要麼就是一些非法的資料;另乙個問題就是delete這個指標時候會產生相應異常(針對這個問題的思考:如果exe和dll都鏈結到dll的c/c++執行期庫,那麼**將能夠很好地執行.但是,如果兩個模組中的乙個或者兩個鏈結到靜態c/c++執行期庫,那delete的操作就會失敗.)。這叫乙個折騰的糾結啊

(1)對於stl,在dll中使用的時候,往往存在這些問題,在網路上蒐集了下,這些都是要平時使用stl的時候注意的。

template 是個好東西啊 . 經典的 stl . 強悍的boost. 還有我自己寫的那個 ------- 該死的 ------- 資源管理器.dynamic link也是個好東西啊. 在windows下叫dll, 在unix下叫so (share object) . 它能省下很多重新發布軟體帶來的麻煩.但是當template 遭遇到dynamic link 時候, 很多時候卻是一場惡夢.現在來說說一部分我已經碰到過的問題. 問題主要集中在記憶體分配上.

1> 拿stl來說, 自己寫模板的時候,很難免就用到stl. stl的**都在標頭檔案裡. 那麼表示著記憶體分配的**.只有包含了它的cpp 編譯的時候才會被決定是使用什麼樣的記憶體分配**. 考慮一下: 當你宣告了乙個vector<> . 並把這個vector<>交給乙個 dll裡的**來用. 用完後, 在你的程式裡被釋放了. 那麼如果你 在dll裡往vector裡insert了一些東西. 那麼這個時候insert 發生的記憶體分配的**是屬於dll的. 你不知道這個dll的記憶體分配是什麼. 是分配在**的. 而這個時候.釋放那促的動作卻不在dll裡.....同時. 你甚至無法保證編譯dll的那個傢伙使用的stl版本和你是完全一樣的..> 如此說來, 程式crash掉是天經地義的.... 對策: 千萬別別把你的stl 容器,模板容器在 dll 間傳來傳去 . 記住string也是....

2> 你在dll的某個類裡宣告了乙個vector之類的容器. 而沒有顯式的寫這個類的構造和析構函式. 那麼問題又來了. 你這個類肯定有操作這vector的函式. 那麼這些函式會讓vecoter<>生成**. 這些**在這個dll裡都是一致的. 但是別忘了.你沒有寫析構函式...... 如果這個時候, 別人在外面宣告了乙個這樣的類.然後呼叫這個類的函式操作了這個vector( 當然使用者並不知道什麼時候操作了vector) . 它用完了這個類以後. 類被釋放掉了. 編譯器很負責的為它生成了乙份析構函式的**...... 聽好了.這份**並不是在 dll裡 ... . 事情於是又和1>裡的一樣了.... crash ......(可能還會伴隨著迷茫.....) 對策: 記得dll裡每個類,哪怕式構造析構函式式空的. 也要寫到cpp裡去. 什麼都不寫也式很糟糕的.....同時,更要把任何和記憶體操作有關的函式寫到 .cpp 裡...

3> 以上兩個問題似乎都是比較容易的-----只要把**都寫到cpp裡去, 不要用stl容器傳來傳去就可以了. 那麼第三個問題就要麻煩的多. 如果你自己寫了乙個模板, 這個模板用了stl 容器.......... 這個時候你該怎麼辦呢? 顯然你無法把和記憶體分配相關的函式都寫到.cpp裡去 . template的**都必須放到header file裡..... 對策: 解決這個問題的基本做法是做乙個stl 記憶體分配器 , 強制把這個模板裡和記憶體分配相關的放到乙個.cpp裡去.這個時候編譯這個cpp就會把記憶體分配**固定在乙個地方: 要麼是dll. 要麼是exe裡... 模板+動態鏈結庫的使用問題還很多. 要千萬留心這個陷阱遍地的東西啊

另外,對於這種問題的解決辦法,有下面3種可行辦法:

1. 傳遞vector指標

2. 傳遞const vector

3. 盡量不使用stl作為dll間的傳遞引數,使用指標會更好點

(2) 從乙個可執行程式中輸出模板例項,在另乙個可執行程式中引入此例項。例如:mylibrary.dll將vector 指標回傳給myprogram.exe中的乙個函式,需要在mylibrary.dll中輸出myclass類和vector 。在myprogram.exe中引入它們後。就可以得到mylibrary.dll中靜態資料成員的乙份copy了。

函式作為引數傳遞

作為學前端的小白,剛開始學到函式作為引數傳遞時,簡直一臉的懵逼,為什麼有時候要加括號,有時候又不用,特別是遇到setinterval的時候。下面是參考網上的一些答案,做的一些總結 要是有什麼錯誤不合理的地方,煩請指正哦 1 首先要理解一點,函式是一種叫做function引用型別的例項,因此函式是乙個...

函式作為引數傳遞

1.當函式作為引數傳遞時,一般使用函式指標 下面是例子 include typedef int func int x,int y 定義函式指標,指向引數為int x int y 返回值為int的函式 intfunc1 int x,int y 函式func1,引數為int x int y 返回值為in...

指標作為引數傳遞

如果想通過函式呼叫得到n個要改變的值,可以採取下面的步驟 在主調函式中設n個變數,用n個指標變數指向它們 編寫被呼叫函式,其形參為n個指標變數,這些形參指標變數應當與主調函式中的n個指標變數具有相同的基型別 在主調函式中將n個指標變數作實參,將它們的值 是位址值 傳給所呼叫函式的n個形參指標變數,這...