看板 C_and_CPP 關於我們 聯絡資訊
在看 程式設計師的自我修養 第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)
purpose:#1FWIgryW (Programming) 至於 stack,沒有分不同 01/15 18:41
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