【转】跨DLLnew delete问题
【轉】跨DLLnew delete問題
轉兩篇文章來說這個問題的
鏈接1:https://blog.csdn.net/notebook2001a/article/details/6647850
鏈接2:https://blog.csdn.net/zj510/article/details/35290505? 這篇文章疑點很多,有時間再細究,特別是下面這段
------------------------------------------------------------------------------------------------------------------------
根本原因
假設DLL是靜態link crt (MT),EXE是動態link (MD)。我畫了個示意圖。
------------------------------------------------------------------------------------------------------------------------
個人理解:
動態鏈接與靜態鏈接
靜態鏈接:此時靜態庫就像一個obj文件一樣被縫合進了EXE
試想若每個程序都把系統的庫靜態鏈接入自己中,N個程序將復制N份系統庫,運行時將重復大量的內存
而動態鏈接庫則是共享庫只加載一份到內存中,各程序共同使用它。
因為每個進程都有自己的虛擬空間,這個空間就是CPU的尋址范圍,32位CPU,尋址能力是4GB,
就是說32位CPU上,每個進程的虛擬內存都是4GB
那么,由于動態鏈接庫不是縫合到EXE中的,因此也不能映射到EXE的進程中,
故,動態鏈接庫加載到內存中時也是有獨立的虛擬空間的,
這就引出了一個著名問題:跨鏈接庫 NEW/DELETE的問題,
在一個DLL中用NEW申請內存,在另一個DLL或EXE中 DELETE釋放內存可能會出現問題,
?
參考文章:
VS項目屬性中C/C++運行庫 、MT /MTd /MD /MDd
posted on 2018-08-08 14:33 時空觀察者9號 閱讀(...) 評論(...) 編輯 收藏
總結
以上是生活随笔為你收集整理的【转】跨DLLnew delete问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】托管C++
- 下一篇: 【转】PBR基于物理的渲染