dll和exe在內存運行時有什麼區別?

今天初學dll,但我在封裝一個程序的時候發現把vector之類的stl封裝到dll裡面,exe去調用的時候vector的地址會異常,上網查了一下說不能夠這樣使用,哪位大神可以詳細介紹一下這兩種文件的區別嗎?以及在運行的時候的一些機制,網上在這方面的介紹好像並不全面。


vector是模板,模板是編譯時做特化的,所以你的exe和dll裡面都有vector的代碼。因此你很可能在exe的vector裡面new了什麼東西,然後被dll的vector給delete了(或者反過來),這種情況就會直接AV。exe只能delete自己new的內存,dll也一樣。

如果你一定要庫跨dll使用vector的話,必須保證你用的每一【種】vector的所有代碼都鏈接到了同一個dll上面,見:c++ - Importing explicitly instantiated template class from dll


解決這種問題的最好方法就是自己動手調試.

@vczh和他回答下的評論里有提到,不同模塊使用了不同的堆,導致free的時候崩潰.這個問題在老一點的IDE里存在(比如vs2003),但是在vs2013里,好像已經不存在了.

詳細分析請看這個靜態庫那些事兒/MT /MD - 各種Crash - 知乎專欄


生成一個 EXE 或者 DLL 的時候,是 static linker 負責 resolve 所有的 symbols。而不同的 DLL 和 EXE 形成一個 runtime executable image 的時候,是 dynamic linker 負責 resolve 剩下的 symbol。


學習的時候試試就好了,生產環境很不推薦在dll里暴露C++介面,尤其是模板介面。因為除非所有的binary都在你的控制之下,否則他們一旦使用的編譯器不同(版本不同也算),就極有可能內存miss match垮掉。

最好是只使用C介面,內部用C++實現。視情況還要把所有異常接住轉換成錯誤碼。


沒什麼區別,模板是編譯期就處理好的,封裝到dll里就沒容器這個概念了,樓主補一下編譯器處理流程


少年可以試試用工廠(手動滑稽


推薦閱讀:

c++ 在使用vector::push_back時是否需要使用try...catch...包裹起來?
C++ 需要 restrict 關鍵字嗎?
在校學生深入學習QT後會不會找不到比較好的工作?
如何編寫異常代碼?比如處理bad-alloc的時候,是不是應該先銷毀當前資源?
面試 C++ 被人問你是如何優化你的代碼的,該從哪些方面進行回答?

TAG:編程 | C | Windows開發 | CC | 動態鏈接庫 |