[英]Memory manager for cross DLL allocation/deallocation
解决:经过几次实验,似乎是有可能的。
我想知道是否有可能通过让内存管理器附带重载的内存函数(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,而是混合了不同的内存管理器。 具体来说,当用于释放某些块的分配器与最初分配该块的分配器不同时,就会出现问题。 一个常见的问题是两个分配器期望不同的元数据布局(例如,存储块大小的位置)。 您的“解决方案”仅在混合中添加了另一个内存管理器,因此它仅增加了由不同的内存管理器完成分配和释放的更多可能性。 编辑: 如果可以强制所有内存分配和释放使用限于单个DLL内的内存管理器,则可能会正常工作。 但是,正如汉斯·帕桑特(Hans Passant)在评论中指出的那样,如果可以强制执行,则很可能还可以强制所有组件使用相同的CRT版本。
DLL仅与此问题相关,因为大多数内存分配是通过C或C ++运行时提供的内存管理器进行的,并且这些依赖于DLL的编译方式,它们通常有所不同(甚至比其余运行时库更大)。 如果您小心的话,可以成功地跨DLL边界分配和解除分配,并且在单个DLL中可能遇到类似的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.