Redian新闻
>
CVS 照相,可以用ECB吗?有包子答谢
avatar
CVS 照相,可以用ECB吗?有包子答谢# PennySaver - 省钱一族
r*u
1
【 以下文字转载自 Programming 讨论区 】
发信人: raou (raou), 信区: Programming
标 题: Windows下多个DLL之间memory allocation问题
发信站: BBS 未名空间站 (Tue May 21 12:29:43 2013, 美东)
Windows下,如果在一个DLL里malloc一个buffer,在另外DLL里free,有没有问题?每
个DLL有自己的heap,还是整个程序有一个heap?谢谢
avatar
m*9
2
我要办去英国的签证,需要照片,我有10刀的ECB,我可以用它吗?找个证明像多少钱
?怎么组合省钱?谢谢!有包子犒劳,thanks
avatar
f*n
3
16位的windows程序每个dll有自己的segment,所以有near pointer和far pointer的区
别。32/64位的程序没有这个问题,整个进程用一个default heap,GetProcessHeap()
。你可以用HeapCreate()创建新的Heap。32/64位程序里,GlobalAlloc和LocalAlloc都
是用HeapAlloc实现的。所以在一个dll里调用HeapAlloc可以在另一个dll里用HeapFree。
但是malloc/free的情况比较特殊。malloc/free是编程语言/类库提供的,不是系统提
供的。通常情况下malloc/free是用HeapAlloc/HeapFree实现的,但除非你能保证两个
dll用的是一样的实现方式,否则有可能会不匹配,造成一个dll用malloc分配的内存不
能被另一个dll用free释放。所以要是用malloc/free的话最好在同一个dll里做,用
HeapAlloc/HeapFree的话就无所谓了。
avatar
h*2
4
可以,还可以跟其他东西并一起用off coupon,记得是$8.99
avatar
n*e
5

HeapFree。
呵呵,这个牛!

【在 f******n 的大作中提到】
: 16位的windows程序每个dll有自己的segment,所以有near pointer和far pointer的区
: 别。32/64位的程序没有这个问题,整个进程用一个default heap,GetProcessHeap()
: 。你可以用HeapCreate()创建新的Heap。32/64位程序里,GlobalAlloc和LocalAlloc都
: 是用HeapAlloc实现的。所以在一个dll里调用HeapAlloc可以在另一个dll里用HeapFree。
: 但是malloc/free的情况比较特殊。malloc/free是编程语言/类库提供的,不是系统提
: 供的。通常情况下malloc/free是用HeapAlloc/HeapFree实现的,但除非你能保证两个
: dll用的是一样的实现方式,否则有可能会不匹配,造成一个dll用malloc分配的内存不
: 能被另一个dll用free释放。所以要是用malloc/free的话最好在同一个dll里做,用
: HeapAlloc/HeapFree的话就无所谓了。

avatar
m*9
6
thanks,
包子已发,请查收
avatar
r*u
7
解释的很清楚,多谢啊。
我再问个问题啊,如果32/64的程序,那么如果一个DLL是C#,一个DLL是C++,那么如
果我在C++里分配内存,然后把指针传给C#,需要call C++的函数来释放内存么?

HeapFree。

【在 f******n 的大作中提到】
: 16位的windows程序每个dll有自己的segment,所以有near pointer和far pointer的区
: 别。32/64位的程序没有这个问题,整个进程用一个default heap,GetProcessHeap()
: 。你可以用HeapCreate()创建新的Heap。32/64位程序里,GlobalAlloc和LocalAlloc都
: 是用HeapAlloc实现的。所以在一个dll里调用HeapAlloc可以在另一个dll里用HeapFree。
: 但是malloc/free的情况比较特殊。malloc/free是编程语言/类库提供的,不是系统提
: 供的。通常情况下malloc/free是用HeapAlloc/HeapFree实现的,但除非你能保证两个
: dll用的是一样的实现方式,否则有可能会不匹配,造成一个dll用malloc分配的内存不
: 能被另一个dll用free释放。所以要是用malloc/free的话最好在同一个dll里做,用
: HeapAlloc/HeapFree的话就无所谓了。

avatar
r*u
8
我感觉windows的dll就相当于linux下的.so文件吧,linux下有我提到的这个内存分配
问题么?

HeapFree。

【在 f******n 的大作中提到】
: 16位的windows程序每个dll有自己的segment,所以有near pointer和far pointer的区
: 别。32/64位的程序没有这个问题,整个进程用一个default heap,GetProcessHeap()
: 。你可以用HeapCreate()创建新的Heap。32/64位程序里,GlobalAlloc和LocalAlloc都
: 是用HeapAlloc实现的。所以在一个dll里调用HeapAlloc可以在另一个dll里用HeapFree。
: 但是malloc/free的情况比较特殊。malloc/free是编程语言/类库提供的,不是系统提
: 供的。通常情况下malloc/free是用HeapAlloc/HeapFree实现的,但除非你能保证两个
: dll用的是一样的实现方式,否则有可能会不匹配,造成一个dll用malloc分配的内存不
: 能被另一个dll用free释放。所以要是用malloc/free的话最好在同一个dll里做,用
: HeapAlloc/HeapFree的话就无所谓了。

avatar
n*e
9
最好这样。c#有AllocHGlobal() FreeCoTaskMem()可以free LocalAlloc 和
CoTaskMemAlloc分配的memory。但是最好的办法是哪里申请哪里销毁。比较符合设计思
想。

【在 r**u 的大作中提到】
: 解释的很清楚,多谢啊。
: 我再问个问题啊,如果32/64的程序,那么如果一个DLL是C#,一个DLL是C++,那么如
: 果我在C++里分配内存,然后把指针传给C#,需要call C++的函数来释放内存么?
:
: HeapFree。

avatar
c*q
10
那么如果一个DLL是C#,一个DLL是C++,那么如
这个跟一个DLL是C++,另一个DLL也是C++的情况是一样的
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。