什么时候DLL会使用与可执行文件不同的堆?

时间:2011-01-10 17:47:21

标签: c++ dll

我知道如果你的DLL静态链接到不同版本的运行时,那么它会创建自己的堆。如果它被指示制作堆也将如此。在这种情况下,DLL删除exe分配的内容是不安全的。在什么情况下这不适用(例如,DLL安全删除exe分配的内容)?如果exe和DLL静态链接同一个运行时库是否安全?

由于

基本上有一种方法,无论谁分配它都可以addEvent(new DerivedEvent(), FunctorDestroyClass());

2 个答案:

答案 0 :(得分:2)

我可能会在您的问题中阅读更多内容,但如果您想知道如何在DLL边界内分配和释放内存,那么您可能会使用以下内容:

#define DLLMemAlloc( size ) HeapAlloc( GetProcessHeap(), 0, size )
#define DLLMemFree( mem )   HeapFree( GetProcessHeap(), 0, mem )

这可能更安全(部分尝试进行未来验证)。依靠各种构建选项来保证跨越边界的分配和释放的安全性可能会导致问题。

而且(也不是问题的一部分),您可能会重新考虑是否真的有必要这样做。如果一个DLL必须分配另一个DLL(或可执行文件)必须释放的内容,似乎可能存在设计缺陷。

答案 1 :(得分:0)

如果你静态链接运行时库,

DLL将获得它自己的内存管理器。您有3个选项:动态链接运行时,始终在同一位置分配和取消分配(DLL或可执行文件,必要时提供转发),或使用第三方内存分配器来处理此问题。