DLL / SO库,库内存如何与调用进程相关?

时间:2011-08-28 00:10:44

标签: c++ dll shared-objects

我正在读取当进程终止时(通过任何方式)操作系统释放所有进程的内存,因此无需依次调用每个dtor。

现在我的问题是DLL或SO的内存如何与清理alloc'd内存有关?

我问,因为我可能最终会使用Java和/或C#调用带有一些静态C样式函数的C ++ DLL,这些函数将在堆上分配C ++对象。对不起,如果我厌倦了堆与堆栈线程,我觉得我已经忽略了 _ _ 堆的概念(即只有一个)。

使用库时内存泄漏的任何其他潜在缺陷?

2 个答案:

答案 0 :(得分:1)

没有什么可以担心的。操作系统的加载器负责处理这个问题。

通常,共享库将通过内存映射(由加载器完成)使进程的地址空间可见,并且操作系统会跟踪仍需要给定共享库的进程数。每个进程单独需要的状态数据通常通过写时复制来处理,因此您的加密库可能不会意外地使用其他进程的密钥:-)简而言之,请不要担心。

编辑。也许你想知道如果你的库函数调用malloc()并且没有清理会发生什么。好吧,库的代码成为你的进程的一部分,所以它实际上是你的进程请求内存,所以当你的进程终止时,操作系统会像往常一样清理。

答案 1 :(得分:1)

库加载后成为进程的一部分。关于整理内存,句柄,资源等,系统无法区分它们是在可执行映像还是库中创建的。