Re: [問題] DLL問題
※ 引述《littleshan (我要加入劍道社!)》之銘言:
: ※ 引述《sunneo (艾斯寇德)》之銘言:
: : 我發表一下淺見@@
: : 有錯請指正
: : 這可能跟malloc/free版本有關
: : 假使今天dll使用a版的malloc/free,而外部程式使用b版的
: : 就可能會因為Heap資訊及處理方式不一致使得這個操作發生錯誤
: : 所以穩定的做法是以HeapFree來釋放
: 但同樣的問題不只會發生在 malloc/free 上
: 也會發生在其它 standard C function 上
: 只要 DLL 與 client code 連結到不同的 C runtime
: 運作起來就很可能發生異常
: 所以穩定的作法應該不是用 HeapFree
: 而是要求 DLL 與 client code 連結相同版本的 C runtime
: : 假使該配置記憶體的變數是一個全域變數且修飾為共享的話
: : 則有可能會因為外部的釋放使得其他使用該配置區塊的程式不正常運作。
: 看不懂這邊
: 所謂的共享是指 shared memory?
: 但 shared memory 本來就不應該用 free 來釋放
: 其它使用該配置區塊的「程式」是指其它的 process?
: 還是指同一個 process 底下的不同 function?
這裡是指其他的process沒錯
不過這裡是舉單純是對無效位址free的例子
假使有一以shared共享的全域變數個指標使用malloc配置記憶體並且作為回傳值
這時候別的process看到的可能是同一個記憶體位址,因為是一個共享變數的資料
但該位址在自己的proecss不見得有配置記憶體,那麼再free的時候就會失敗。
這裡說的shared修飾是以下這兩種
#pragma data_seg("shared")
__attribute__((section ("Shared"), shared))
(或者單純只是在win 95/98/me下的情形)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.39.201.42
※ 編輯: sunneo 來自: 114.39.201.42 (04/11 01:42)
※ 編輯: sunneo 來自: 114.39.201.42 (04/11 01:43)
討論串 (同標題文章)