假设我使用MS visual studio 2005/2008开发了一个DLL,比如1.dll,然后我在加载时将这个DLL链接到一个控制台应用程序,比如说1.exe(使用头文件和.lib文件)然后当在DLL内部,如果我在运行时分配内存,那么谁将堆(免费存储)分配给DLL。
据我所知,DLL使用进程的地址空间来存储数据,代码和堆栈。
答案 0 :(得分:5)
当你制作一个Dll时 - 你总是用某种语言编写它 - 在你的情况下用C ++使用Visual Studio 2005或2008。
在这种情况下,C ++运行时负责创建freestore并决定如何分配它。
具体来说,如果你使用Dll运行时选项,那么一个单独的dll - msvcrtxx.dll - 管理一个在所有dll和exe之间共享的freestore,它们与该dll链接。
如果在使用exe和dll时使用静态运行时选项,那么exe和每个dll都会自己构建libc实例,并拥有自己的freestore管理。
答案 1 :(得分:3)
当您在DLL中执行代码时,代码将在您的进程上下文和正在调用的线程中执行,这样就会在您的进程空间中分配内存。
DLL的实现当然可以跨越新线程或新进程。在后一种情况下,内存分配将在新的分叉进程中进行。
这意味着当1.exe执行DLL时,所有分配的内存(包括堆栈)都会进入您的进程内存空间(即,如果DLL分配1 GB内存,那么它将反映在您的进程内存消耗中)。
答案 2 :(得分:0)
您进行内存管理。 DLL具有单独的堆,因此您需要自己进行管理。当然,根据您的环境,可能会有一个专门的新/删除可供您使用。
有两种类型的动态内存可以处理,和分开:
您可以使用调用process' heap,但对于每个调用进程,这显然都是不同的。因此,您只能根据调用者使用该数据。
对于你的DLL一般使用的内存,独立于调用者,你必须使用HeapCreate及其兄弟函数获得一个单独的“私有”堆。
小心不要将该记忆的责任传递给其他任何东西。你的DLL分配什么,你的DLL将删除 - 否则,你会遇到麻烦。这应该是基本规则,但是在GC上,有些人忘记了如何负责任地使用内存,所以我提到它。