首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存管理器库:静态或DLL/SO

内存管理器库:静态或DLL/SO
EN

Stack Overflow用户
提问于 2011-12-10 18:29:32
回答 1查看 261关注 0票数 1

我目前正在开发一个跨平台的C++游戏引擎(Windows,Mac,Ubuntu)。我已经完成了一个内存管理器模块的编写,我希望其他模块能够使用它。理想情况下,应该只有一个CMemoryManager类的实例来监督所有分配器(堆、arenas等)。然后从其他模块(输入、图形内容管理器等)将其传递给管理器。在其工厂方法中。

我应该如何共享内存模块?将CMemoryManager实例传递给DLL以获取其所有内部分配会有危险吗?风险是什么,我如何避免它们?我之所以对内存模块使用DLL/SO (而不是静态库/归档),是因为我希望动态加载内存模块。通过这种方式,我可以分析各种实现,并可能在未来发布更有效的版本。

例如,

代码语言:javascript
复制
// Win32 Version
Result Engine::LoadModules()
{
    HRESULT input_library = LoadLibrary(input_library_path);
    if(input_library == NULL)
    {
        return Result::Failure(L"InputLibrary Failed To Load");
    }

    InputFactoryFuncPtr InputFactoryFunction;
    InputFactoryFunction = (InputFactoryFuncPtr)GetProcAddress(input_library,"MakeFactory");

    input_factory = InputFactoryFunction(memory_manager,...);
    if(input_factory == NULL)
    {
        return Result::Failure(L"InputLibrary::MakeFactory Failed");
    }

    // The input_factory allocates memory using the memory_manager here.
    keyboard = input_factory.create_keyboard();

    return Result::Success;
}

换句话说,跨DLL边界传递和使用内存管理器实例是否存在风险?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-10 19:11:38

“CMemoryManager类应该只有一个实例”这听起来像是单例模式。回到核心问题,听起来插件架构就是你所需要的。我会使内存管理器类和所有其他模块都是不同类型的动态文件

代码语言:javascript
复制
typedef enum {PLUGIN_TYPE_MEMMGR, PLUGIN_TYPE_NORMAL}PType;

然后在Plugins的构造函数中传递类型(以后可以有多个内存管理器)。然后将有一个插件管理器,它将由引擎创建,并将另一个参数传递给每个插件。Manager应该只有一个MEMMGR类型的插件实例(您可以将其扩展为将来有多个实例,只需很少的代码更改)。插件管理器应该是单例的,这样每个插件都有相同的内存管理器实例。

代码语言:javascript
复制
class PManager{
public:
  PManager(){
     m_memoryManager = LoadPluginSomeHow(PLUGIN_TYPE_MEMMGR);
  }
  CMemoryManager* GetMemoryManager(){
   return m_memoryManager;
}
//other code to do task

private:
  CMemoryManager* m_memoryManager;
};

我不能更好地解释,也许我会编辑和添加信息,但你可以通过阅读this thread有一个想法

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8455859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档