c++ - Dll内存管理

标签 c++ c dll memory-management

我对 Windows 如何管理 .dll 的内存没有任何疑问。

  • 当 .dll 加载到主机时 进程,内存是怎么管理的?

  • .dll 是否可以访问整个 主机进程可用的内存 或者只是其中的一部分?即是 内存有限制 由函数内部分配 .dll?

  • STL 类如字符串、 vector (动态地 增加存储空间)等 dll,在这里工作没有问题吗?

最佳答案

“内存管理”通常是一项分担的责任。操作系统将地址空间以大块的形式交给运行时,然后由运行时将其以较小的部分交给程序。该地址空间可能已分配也可能未分配 RAM。 (如果没有,会有交换空间来支持它)

基本上,当加载 DLL 时,Windows 会为代码和数据段分配地址空间,并调用 DllMain() . C++ 编译器将安排从 DllMain() 调用全局 ctors。 .如果它是用 C++ 编写的 DLL,它可能依赖于 C++ 运行时 DLL,而后者又依赖于 Kernel32.DLL 和 User32.DLL。 Windows 了解此类依赖关系,并将安排它们以正确的顺序加载。

一个进程只有一个地址空间,所以一个DLL可以访问进程的所有内存。如果一个 DLL 在两个进程中加载​​,就会有代码和数据的两个逻辑拷贝。 (虽然代码和只读数据的拷贝可能共享相同的物理 RAM)。

如果 DLL 使用操作系统函数分配内存,Windows 会将内存分配给 DLL 进行分配的进程。进程必须返回内存,但进程中的任何代码都可以这样做。如果您的 DLL 使用 C++ 函数分配内存,它将通过调用 operator new 来分配内存。在 C++ 运行时 DLL 中。必须通过调用 operator delete 返回该内存在(相同的)C++ 运行时 DLL 中。同样,谁来做并不重要。

vector<> 这样的 STL 类可以多次实例化,但只要您使用相同的编译器就没关系。所有实例化将基本相同,并且所有实例化都会将 vector 的内存返回给相同的释放函数。

这个解释有两个主要假设:

  1. EXE 和它的 DLL 都是用同一个编译器编译的
  2. EXE 及其 DLL 都链接到 C++ 运行时 DLL(即非静态链接)

如果您想发布一个独立的 EXE,针对 C++ 运行时的静态链接非常有用。但是,如果您已经发布了 DLL,那么您也应该将 C++ 运行时保留在它自己的 DLL 中。

关于c++ - Dll内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4031249/

相关文章:

c++ - QTableWidget::setItem 上的 Qt4 SegmentationFault

c++ - 在c中的函数内部定义一个函数

c++ - 我应该/可以/必须如何处理我的 C++ 项目所依赖的 dll?

c++ - 我是 C++ 的新手,我不确定如何从 .t​​xt 文件中输入一行以上的数字

c++ - 我可以将 BOOST_FUSION_ADAPT_STRUCT 与继承的东西一起使用吗?

c++ - 确定哪个信号导致了 EINTR?

c - C中的数组桶排序

c - l 需要的值作为赋值的左操作数

string - 无法将字符串从 vba 传递到 Windows dll

dll - 在64位机器上使用32位dll