【发布时间】:2013-05-06 14:41:11
【问题描述】:
已解决:经过几次实验后,这似乎是可能的。
我想知道是否有可能通过让内存管理器伴随重载内存函数(new、delete、delete[]、malloc()...)来避免常见的跨 dll 分配/释放问题并负责任何可以在程序的任何地方发生的分配/解除分配,从而确保一致性。
假设 a.dll 包含内存管理器,例如:
class EXPORT MemoryManager
{
static void* Allocation( size_t uiSize );
static void Deallocation( void* pAllocated );
};
inline void* operator new( size_t uiSize )
{
return MemoryManager::Allocation( uiSize );
}
inline void operator delete( void* pAllocated )
{
MemoryManager::Deallocation( pAllocated );
}
以及其他任何地方,包括 b.dll:
int* piDummy = ExternalDllFunctionCallingNew();
delete piDummy;
能解决问题吗?
【问题讨论】:
-
拥有内存管理器是问题的原因。每个模块都使用自己的。经典的做法是为 DLL 提供它自己的 CRT 版本。只要避免麻烦,编写不需要调用者释放内存的函数,而是将指针传递给缓冲区。
-
看看Windows是如何处理资源的。例如。打开文件/关闭句柄。
-
@HansPassant 是的,我用 CRT 得到了那个东西。但是可以对任何指针进行指针解引用和指针复制。那么为什么我的 sn-p 不能保持一致性呢? Aka,我在哪里使用不同的 CRT ?我可能在这里没有完全清楚。我要说的是为什么我不能使用一个通用类来通过几个 dll 来分配/解除分配。因此使用相同的 CRT 堆管理器。
-
好吧,你可以让它像那样工作。但是,如果您有能力强制每个 DLL 使用完全相同的内存管理器,那么您也有能力确保所有这些 DLL 使用完全相同的共享 CRT 版本。哪个是解决问题的更简单的方法。
标签: memory-management dll