社区
C++ 语言
帖子详情
dll 堆 问题
soft_ruan
2009-05-02 12:05:13
在dll文档里说明dll没有自己的局部堆, 那微软的开发人员为什么要在dll再创建一个堆呢?难道他不可以用进程的默认堆!这样我们调用那些在dll内进行内存操作函数也安全的多,虽然熟读可能会慢点!
...全文
578
10
打赏
收藏
dll 堆 问题
在dll文档里说明dll没有自己的局部堆, 那微软的开发人员为什么要在dll再创建一个堆呢?难道他不可以用进程的默认堆!这样我们调用那些在dll内进行内存操作函数也安全的多,虽然熟读可能会慢点!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
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的加载是当做一个独立的进程模块加载的……
我不知道你为什么会有让模块之间进行内存共享的想法……
Windows进程常用
DLL
模块注入技术
课程结合多种Windows进程常用
DLL
注入技术。远程线程注入APC注入,异步调用过程,向目标线程插入待执行任务从而完成注入。窗口消息注入,指定窗口进程注入,与全局钩子注入类似。环境块注入,获取进程上下文信息,直接性修改程序执行流程完成注入。进程入口点注入,在程序初始化的时机前将
dll
模块文件注入至目标主线程。进程调试级注入,涉及调试器相关功能调用知识点
dll
模块重定位内存注入,模拟操作系统加载PE文件方式,直接将
dll
文件内存数据写入目标进程并执行。导入表注入,涉及PE相关知识点,增加区段,移动导入表,增加导入表、增加导出函数,修复表项数据等。内核驱动级
Dll
模块注入技术,内核驱动入门扩展。
EXE加载
DLL
(两个默认
堆
问题
)
当exe链接到静态C库,
DLL
连接到动态C库时,就会产生两个默认
堆
。此时在一个模块里面new,在另外一个模块里面delete,就会出现
问题
C++
dll
传 string 类
问题
C++中string跨
DLL
失败解决途径 - 爱码网 为什么用c++开发
dll
接口要用char*而不能string_三石目的博客-CSDN博客 C++
dll
传 string 类
问题
_YNStong的博客-CSDN博客_c++
dll
string 原因: 不同的模块各自有一份C运行时库代码、或者根本没有C运行时库,导致了各个模块会有各自的
堆
。如果在A
堆
中申请空间,到B
堆
中释放就会有崩溃,在模块A申请的空间,必须在模块A中释放。 以STL的string为例,通过修改编...
dll
内存分配的理解
自己遇到的
问题
:在
dll
中new的指针返回给调用的线程,然后发现这个指针指向的是一
堆
乱七八糟的东西。 怀疑:由于对
dll
的不了解,然后以为
dll
维护了自己的
堆
,返回的指针指向调用线程的
堆
时,指向的不是同一块空间,最后输出一
堆
乱七八糟的东西。 查阅资料与个人理解:
dll
使用时会被进程(主线程或是其他线程)映射到进程空间,
dll
使用的栈属于调用它的那个线程。使用的
堆
要看它们的CRT
C#调用C++
DLL
出现的
堆
被损坏,说明加载的任何
DLL
中有Bug
很多系统底层使用C++(MFC),界面使用C#(WPF)技术。这就要运用大量的导入导出函数,在C#中调用C++中的函数。由于C#是托管代码,摒弃了C++中“危险”的指针,所以在传递字符串的时候造成一些的
问题
。尤其是在MFC中字符串声明为CString类型,导出函数的返回为char*类型。常规的C#中需要使用string来代替从C++
DLL
中导入的带有char*类型的函数。这就造成了隐患,会产生很多致命的BUG C#调用C++
DLL
出现的
堆
被损坏,说明加载的任何
DLL
中有Bug。
C++ 语言
64,282
社区成员
250,469
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章