В настоящее время я работаю над кроссплатформенным игровым движком C ++ (Windows, Mac, Ubuntu).Я закончил писать модуль менеджера памяти, который хотел бы использовать другие модули.В идеале должен быть только один экземпляр класса CMemoryManager, который наблюдает за всеми распределителями (кучами, аренами и т. Д.). Затем он передается менеджерам из других модулей (входные данные, менеджер графического содержимого и т. Д.) На их фабрикеМетоды.
Как я должен разделить модуль памяти?Будет ли передача экземпляра CMemoryManager в DLL для всех его внутренних распределений опасно?Каковы риски и как их избежать?Моя причина использования DLL / SO для модуля памяти (в отличие от статической библиотеки / архива) заключается в том, что я хотел бы динамически загружать модуль памяти.Таким образом, я могу профилировать различные реализации и, возможно, выпустить более эффективные версии в будущем.
Например,
// 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?