已解决:经过一些实验后似乎很可能。
我想知道是否可以通过让内存管理器出现重载内存函数(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;
它会解决问题吗?
答案 0 :(得分:1)
您可能误解了这个问题。问题不仅仅是几个DLL,问题是混合不同的内存管理器。具体地说,当用于释放某个块的分配器与最初分配该块的分配器不同时,会出现问题。一个常见问题是两个分配器期望不同的元数据布局(例如,存储块的大小的位置)。您的“解决方案”只是添加了另一个内存管理器,因此它只为不同的内存管理器添加更多分配和释放的可能性。 编辑: 如果您可以强制执行所有内存分配,并且释放使用限制在单个DLL中的内存管理器,它可能只会工作精细。但是,正如Hans Passant在评论中指出的那样,如果您可以强制执行,您很可能也会强制所有组件使用相同的CRT版本。
DLL仅与此问题相关联,因为大多数内存分配是通过C或C ++运行时提供的内存管理器进行的,并且这些内存分配通常不同(甚至比其他运行时库更多),具体取决于DLL的方式编译。如果您小心,可以跨DLL边界成功分配和解除分配,并且您可以在单个DLL中获得类似的问题。