由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - Windows下多个DLL之间memory allocation问题 (转载)
相关主题
一般电面C++会问到什么专业问题?问大家一个cpp中function pointer的问题
菜鸟问个C++的pointer问题C++ Q93 - Q95
问几个面试题谁对design pattern比较熟?
想自学c++,现在巨土的问题问一下一个简单的java题
google 一题什么情况下pass by reference比pass by pointer好?
弱问内存的问题One question about Void pointer (转载)
问一道关于reverse a C-string的问题请教个编程题,比较急,坐等
bloomberg新鲜面经My Microsoft Phone Interview
相关话题的讨论汇总
话题: dll话题: windows话题: heapfree话题: c++话题: malloc
进入JobHunting版参与讨论
1 (共1页)
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++的情况是一样的
1 (共1页)
进入JobHunting版参与讨论
相关主题
My Microsoft Phone Interviewgoogle 一题
说一下pressure interview。。。弱问内存的问题
今早Bloomberg电话面试经过,奉献给大家。。。问一道关于reverse a C-string的问题
MathWorks被拒bloomberg新鲜面经
一般电面C++会问到什么专业问题?问大家一个cpp中function pointer的问题
菜鸟问个C++的pointer问题C++ Q93 - Q95
问几个面试题谁对design pattern比较熟?
想自学c++,现在巨土的问题问一下一个简单的java题
相关话题的讨论汇总
话题: dll话题: windows话题: heapfree话题: c++话题: malloc