作者sunneo (艾斯寇德)
看板C_and_CPP
标题Re: [问题] DLL问题
时间Sat Apr 11 01:39:33 2009
※ 引述《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)