c++怎麼在動態鏈接庫里使用string類?
01-13
看了網上一些資料,說dll里最好用PCHAR,而且不要在dll裡面動態分配內存,因為dll和調用dll程序使用的是不同的堆。結果好像嘗試了不同的代碼生成方式(MT和MTd)都無法解決這個問題。請問應該通過什麼方法才能在dll中正常地使用string類?
最安全的方式是不要跨 DLL boundary 使用 C++ 對象,尤其是 STL。
DLL 和調用 DLL 程序使用的是不是一個堆,取決於整個工程的 CRT 使用方式。如果 CRT 是動態鏈接的,那麼程序本身和所有 DLL 都使用一個堆。如果 CRT 是靜態鏈接,那麼必然是逐一靜態鏈接到程序本身和每個 DLL 上,那麼每個模塊都是一個單獨的堆。可以,要注意一些細節,先佔坑
已填坑
爪機碼字一大段直接沒了,我的心好痛
1.exe和dll全部使用動態鏈接
因為dll和exe是鏈接到同一個運行庫dll上的,因此使用的是同一份運行庫的代碼,內存分配是在一個堆上的。對於所有類所有特性都能跨二進位文件使用2.只要任意一個使用了靜態鏈接,你就不能向上面一樣使用
原因:靜態鏈接會在生成的二進位文件里包含庫的代碼,那麼你的dll和exe使用的其實是兩個運行庫的代碼,自然會有兩個不同堆的問題解決方案:1.對於dll中導出的對象避開所有malloc(new)和free(delete)操作,dll中使用exe里的對象也一樣2.將exe里和dll里的malloc(new)和free(delete)地址弄出來,人工避免混用3.利用c++虛函數。由於虛函數的地址是在運行期綁定的,因此你可以利用這個特性來避免混用exe和dll中的malloc(new)和free(delete)。比如你在dll里new了一個class a並在exe里使用它,那你就不能在exe里直接delete之。你應該為a添加一個virtual的releasevirtual void release()
{ delete this;}需要釋放資源的時候調用release。對於所有需要申請內存的操作同理。然而對於string在靜態鏈接的情況下除了解決方法1都沒有什麼卵用,除非你自己實現一個。所有的dll都用相同的VC++編譯器版本的完全一致的編譯選項編譯出來的話,那可以直接用沒問題。
起碼對於mt編譯的模塊是不能跨模塊使用的,因為mt編譯的時候每個模塊都有自己的crt,每個模塊自己維護new出來的內存,如果互操作就會破壞維護內存塊的數據結構。如果都是非mt編譯,同版本的vs,是沒有問題的。
以上沒有驗證,但應該是沒有問題的。可以驗證下告知結果(?? . ??)如果你的dll只是在你自己的解決方案中使用,那麼只要保證大家的編譯、鏈接版本一致即可,string、vector都是可以用的。
如果你的dll是個公共組件,會提供給別人使用,那麼最妥善的方式還是使用c介面來發布,在介面的定義中不宜使用c++,尤其不宜使用stl。c++ - How can I use Standard Library (STL) classes in my dll interface or ABI?一個原則是,你的DLL公共類的ABI必須是確定的,除非你自己改代碼,否則這個ABI不應該隨著DLL的編譯器版本而改變,但是STL做不到這一點,因為他的實現不受DLL作者控制。但是STL可以在DLL私有部分使用,只要其細節不被暴露出來即可。推薦文章:"How to export an instantiation of a Standard Template Library (STL) class and a class that contains a data member that is an STL object「 - 微軟此鏈接知乎無法自動解析(
「https://support2. microsoft.com/default.aspx?scid=KB;EN-US;168958」
DLL給自己用,沒問題給別人用,問題很大
Linux 下沒這問題。
誰分配誰釋放,保證一致就沒問題
MD編譯可以,因為是動態鏈接的CRT庫,內存分配和釋放都是在CRT的DLL中做的。但是依然不建議這麼做,跨越DLL邊界最好只使用基本類型,POD類型和虛函數表
僅在dll內部使用完全無壓力。如果不能保證一起使用的dll的編譯環境完全一致的話,盡量不要在兩個dll的介面參數中使用string
絕對不能這麼使用!
源碼發布 學sqlite的方式 輪子哥好像就一直這麼做的 以前好像還推崇過
推薦閱讀:
※windows 內存分配的極限?
※該內存不能為「read/written」的錯誤提示是否存在翻譯不嚴謹,比較「該內存無法被讀取/寫入」?
※如何徹底刪除魯大師?
※如何評價Windows 10 創意者更新的 「Dolby Atmos for headphones」?
※一直用的OS X,轉到Windows以後卡的要死怎麼辦?
TAG:MicrosoftWindows | C | 動態鏈接庫 | string |