dll 堆 问题

soft_ruan 2009-05-02 12:05:13
在dll文档里说明dll没有自己的局部堆, 那微软的开发人员为什么要在dll再创建一个堆呢?难道他不可以用进程的默认堆!这样我们调用那些在dll内进行内存操作函数也安全的多,虽然熟读可能会慢点!
...全文
342 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
caremsi 2009-05-02
帮顶。。
回复
soft_ruan 2009-05-02
[Quote=引用 2 楼 hikaliv 的回复:]
为什么你知道进程有默认堆?
WINAPI对DLL的加载是当做一个独立的进程模块加载的好不好?既然如此,DLL能没有自己的进程堆么……
你可能还不了解WIN平台是如何加载DLL的吧……
[/Quote]

所有的进程都有默认堆, 所有的dll是没有默认堆的,dll中对与内存的操作所依赖的是C-Runtime Library中建立的一个堆,他跟加载他的exe用的不是同一个堆,所以模块之间的内存互操作是很危险的! 当我认为如果微软的C-Runtime Library依赖的是进程的默认堆的话,就不会出现这样的危险!
回复
lingyin55 2009-05-02
这个可能考虑到不同平台的关系吧。
回复
mengde007 2009-05-02
在dll里面可以使用new或者GlobalAlloc分配空间;
new 分配的内存是在DLL堆空间中。
GlobalAlloc是在进程堆空间中。
回复
liliangbao 2009-05-02
学习~
回复
Jinhao 2009-05-02
不知所云...

堆是操作系统维护,而在C++中,该动态分配的内存称之为自由存储区,建立在堆之上,自由存储区由CRT维护,DLL可以由多种编译器/语言开发,因此其DLL内部的内存管理可能会是不同的自由存储区或根本就没有自由存储区。因此,两个不同的DLL相互释放彼此的内存是很危险的。
回复
doudouHuY 2009-05-02
dll和exe的加载应该是一样,不过各自依赖的crt库就不一定相同,不同crt库使用的堆不同,这也是为啥要遵循在同一dll分配和释放内存的原因所在。
回复
野男孩 2009-05-02
考虑一种最明显的情况,DLL是C语言写的,内存管理使用的是C-Runtime Library, Exe可能是PB写的,有它自己的内存管理,这是没办法共用的。
回复
光宇广贞 2009-05-02
为什么你知道进程有默认堆?
WINAPI对DLL的加载是当做一个独立的进程模块加载的好不好?既然如此,DLL能没有自己的进程堆么……
你可能还不了解WIN平台是如何加载DLL的吧……
回复
光宇广贞 2009-05-02
[Quote=引用 7 楼 soft_ruan 的回复:]
引用 2 楼 hikaliv 的回复:

为什么你知道进程有默认堆?
WINAPI对DLL的加载是当做一个独立的进程模块加载的好不好?既然如此,DLL能没有自己的进程堆么……
你可能还不了解WIN平台是如何加载DLL的吧……


所有的进程都有默认堆, 所有的dll是没有默认堆的,dll中对与内存的操作所依赖的是C-Runtime Library中建立的一个堆,他跟加载他的exe用的不是同一个堆,所以模块之间的内存互操作是很危险的! 当我认为如果微软的C-Run…
[/Quote]

Dll 的目的是为了模块重用。它并不知道它会被谁调用,会被多少个外部进程来调用。因此它对于外部进程来说必须是独立的。如果它和调用它的进程共享内存才是真正危险的呢。“模块之间的内存互操作”这种想法本身就是不被允许的。进程间可以通过 pipe 啦,消息循环啦,函数封送啦多种方法进行通信,这些都是现有的成熟的机制。只有同一进程的多个线程才会允许共同享用该进程的内存空间。这些操作系统上不是已经讲得很清楚了么……

原音重现:WINAPI对DLL的加载是当做一个独立的进程模块加载的……

我不知道你为什么会有让模块之间进行内存共享的想法……
回复
相关推荐
发帖
C++ 语言
创建于2007-09-28

6.0w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2009-05-02 12:05
社区公告
暂无公告