作者QQ29 (我愛阿蓉)
看板C_and_CPP
標題[問題] 不同dll無法任意互相release resource?
時間Tue Jan 15 18:01:53 2013
在看 程式設計師的自我修養 第11章節..
前面雖然看的懵懵懂懂
但一直有個疑問不太了解
常常聽到有人把這當rule
"你在某dll alloc的resource 請你在那個dll 做 free, 否則"可能" 會出問題"
google 不確定有啥公定的關鍵字
http://stackoverflow.com/questions/4781460/who-allocates-heap-to-a-dll
這看到這邊好像有提到類似問題不過還是不太能理解
書中p349 Q&A
再談不同DLL or EXE使用不同的CRT 會發生啥事
這是上面這疑問的首要假設嗎?
一切都是因為用到的CRT可能不同 所以才有這個rule的產生嗎?
書中看到這 有幾個觀念想釐清
1. 某exe load了不管幾個dll, 每個dll都有自己的heap, 所以可以說heap是不連續的
virtual memory空間?
所以我malloc 若是A.exe就在A's heap, B.dll就是在B's heap這樣嚕? 甚至連stack
也會有分module 不同module有不同的stack?
2. 若CRT都是同一版, 是不是不管誰去new跟delete 理論上都不會出事?
若以上觀念沒問題
想問以下幾個疑問
1. A.exe使用靜態把CRT 編進去 使用了CRT已經是鎖死在A.exe裡面了
他load B.dll B.dll也是用靜態的方式bind CRT
若剛好他們編譯環境一模一樣
照理講就不會發生問題了?(誰new就要誰delete)
反之 若B.dll 剛好編譯到舊版的CRT 就可能發生問題嗎?
2. A.exe使用動態 連結CRT, 而B.dll 也是動態
假設我把這包程式丟給使用者X
他的CRT就只會有一個所以應該也不會發生問題?
3. 這種問題是不是只有牽扯到CRT這"版本不同 實作Memory management的方式不同" 還
是有其他的因素會導致這問題?
若他MM的algorithm並沒有改變, 也不會發生問題嚕?
4. 這有沒有專有名詞或是經典的討論文章呢
5. 是不是每台電腦非programmer 都有CRT的dll在system32裡面呢.....
因為沒有沒VS的電腦...無法確認
以上請各位指證
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.163.58.205
※ 編輯: QQ29 來自: 118.163.58.205 (01/15 18:07)
→ TeaEEE:因為配置記憶體有幾種不同的方法 01/15 19:37
→ QQ29:需要一點時間吸收@@ 不過看起來跟CRT好像沒關聯? 01/16 15:01
→ QQ29:不同module free對方的memory 就有p大妳說找不到的情形? 01/16 15:02
→ QQ29:因為又不是我new的 我找不到你指定的這塊?? 01/16 15:02
推 purpose:事情就很單純,只要你的 C/C++ 程式有用到 free/delete 且 01/16 16:18
→ purpose:是在 Win 運行,那麼不管是用 VC 或 GCC,最後底層都是用 01/16 16:19
→ purpose:HeapFree 在跑。所以這跟是不是 CRT,哪版 CRT 無關 01/16 16:19
推 purpose:main.exe 就像高雄,some.dll 就像台南,當你從台南使用 01/16 16:40
→ purpose:不能指定區碼的 free 這台電話,打到高雄市政府,就會打錯 01/16 16:41
→ purpose:變成 06-336-8333,而正確位置是 07-336-8333 01/16 16:41
→ QQ29:謝謝! 那這本書上就可能比較廣闊的在討論CRT版本不一致可能 01/16 21:56
→ QQ29:會出問題吧@@ 01/16 21:56