繁体   English   中英

跨DLL分配/取消分配的内存管理器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM