r**u 发帖数: 1567 | 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?谢谢 |
f******n 发帖数: 198 | 2 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的话就无所谓了。 |
n***e 发帖数: 723 | 3
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的话就无所谓了。
|
r**u 发帖数: 1567 | 4 解释的很清楚,多谢啊。
我再问个问题啊,如果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的话就无所谓了。
|
r**u 发帖数: 1567 | 5 我感觉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的话就无所谓了。
|
n***e 发帖数: 723 | 6 最好这样。c#有AllocHGlobal() FreeCoTaskMem()可以free LocalAlloc 和
CoTaskMemAlloc分配的memory。但是最好的办法是哪里申请哪里销毁。比较符合设计思
想。
【在 r**u 的大作中提到】 : 解释的很清楚,多谢啊。 : 我再问个问题啊,如果32/64的程序,那么如果一个DLL是C#,一个DLL是C++,那么如 : 果我在C++里分配内存,然后把指针传给C#,需要call C++的函数来释放内存么? : : HeapFree。
|
c**q 发帖数: 94 | 7 那么如果一个DLL是C#,一个DLL是C++,那么如
这个跟一个DLL是C++,另一个DLL也是C++的情况是一样的 |